Update from 4.4-Lite, with local changes.

This commit is contained in:
mycroft 1994-06-08 19:23:02 +00:00
parent cf6f15bde0
commit 5922d844af
20 changed files with 1301 additions and 103 deletions

12
sbin/mount_nfs/Makefile Normal file
View File

@ -0,0 +1,12 @@
# from: @(#)Makefile 8.2 (Berkeley) 3/27/94
# $Id: Makefile,v 1.1 1994/06/08 19:23:02 mycroft Exp $
PROG= mount_nfs
SRCS= mount_nfs.c getmntopts.c
MAN8= mount_nfs.0
MOUNT= ${.CURDIR}/../mount
CFLAGS+= -DNFS -I${MOUNT}
.PATH: ${MOUNT}
.include <bsd.prog.mk>

223
sbin/mount_nfs/mount_nfs.8 Normal file
View File

@ -0,0 +1,223 @@
.\" Copyright (c) 1992, 1993, 1994
.\" The Regents of the University of California. 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 by the University of
.\" California, Berkeley and its contributors.
.\" 4. Neither the name of the University nor the names of its contributors
.\" may be used to endorse or promote products derived from this software
.\" without specific prior written permission.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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.
.\"
.\" from: @(#)mount_nfs.8 8.2 (Berkeley) 3/27/94
.\" $Id: mount_nfs.8,v 1.1 1994/06/08 19:23:03 mycroft Exp $
.\"
.Dd March 27, 1994
.Dt MOUNT_NFS 8
.Os BSD 4.4
.Sh NAME
.Nm mount_nfs
.Nd mount nfs file systems
.Sh SYNOPSIS
.Nm mount_nfs
.Op Fl KMPTbcdiklqs
.Op Fl D Ar deadthresh
.Op Fl L Ar leaseterm
.Op Fl R Ar retrycnt
.Op Fl a Ar maxreadahead
.Op Fl g Ar maxgroups
.Op Fl m Ar realm
.Op Fl o Ar options
.Op Fl r Ar readsize
.Op Fl t Ar timeout
.Op Fl w Ar writesize
.Op Fl x Ar retrans
.Ar rhost:path node
.Sh DESCRIPTION
The
.Nm mount_nfs
command
calls the
.Xr mount 2
system call to prepare and graft a remote nfs file system (rhost:path)
on to the file system tree at the point
.Ar node.
This command is normally executed by
.Xr mount 8 .
It implements the mount protocol as described in RFC 1094, Appendix A.
.Pp
The options are:
.Bl -tag -width indent
.It Fl D
Used with NQNFS to set the
.Dq "dead server threshold"
to the specified number of round trip timeout intervals.
After a
.Dq "dead server threshold"
of retransmit timeouts,
cached data for the unresponsive server is assumed to still be valid.
Values may be set in the range of 1 - 9, with 9 referring to an
.Dq "infinite dead threshold"
(i.e. never assume cached data still valid).
This option is not generally recommended and is really an experimental
feature.
.It Fl K
Pass Kerberos authenticators to the server for client-to-server
user-credential mapping.
This may only be used over TCP mounts between 4.4BSD clients and servers.
.It Fl L
Used with NQNFS to set the lease term to the specified number of seconds.
Only use this argument for mounts with a large round trip delay.
Values are normally in the 10-30 second range.
.It Fl M
Assume that other clients are not writing a file concurrently with this client.
This implements a slightly less strict consistency criteria than 4.3BSD-Reno
did, that is more in line with most commercial client implementations.
This is recommended for servers that do not support leasing.
.It Fl P
Use a reserved socket port number.
This is useful for mounting servers that require clients to use a
reserved port number.
.It Fl R
Set the retry count for doing the mount to the specified value.
.It Fl T
Use TCP transport instead of UDP.
This is recommended for servers that are not on the same LAN cable as
the client.
(NB: This is NOT supported by most non-BSD servers.)
.It Fl a
Set the read-ahead count to the specified value.
This may be in the range of 0 - 4, and determines how many blocks
will be read ahead when a large file is being read sequentially.
This is recommended for mounts with a large bandwidth * delay product.
.It Fl b
If an initial attempt to contact the server fails, fork off a child to keep
trying the mount in the background.
Useful for
.Xr fstab 5 ,
where the filesystem mount is not critical to multiuser operation.
.It Fl c
For UDP mount points, do not do a
.Xr connect 2 .
This must be used for servers that do not reply to requests from the
standard port number.
.It Fl d
Do not estimate retransmit timeout dynamically.
This may be useful for UDP mounts that exhibit high retry rates.
.It Fl g
Set the maximum size of the group list for the credentials to the
specified value.
This should be used for mounts on old servers that cannot handle a
group list size of 16, as specified in RFC 1057.
Try 8, if users in a lot of groups cannot get response from the mount
point.
.It Fl i
Make the mount interruptible, which implies that file system calls that
are delayed due to an unresponsive server will fail with EINTR when a
termination signal is posted for the process.
.It Fl k
Used with NQNFS to specify
.Dq get a lease
for the file name being looked up.
This is recommended unless the server is complaining about excessive
lease load.
.It Fl l
Used with NQNFS to specify that the \fBReaddir_and_Lookup\fR RPC should
be used.
This option reduces RPC traffic for cases such as
.Dq "ls -l" ,
but increases the lease load on the server.
This is recommended unless the server is complaining about excessive
lease load.
.It Fl m
Set the Kerberos realm to the string argument.
Used with the
.Fl K
option for mounts to other realms.
.It Fl o
Options are specified with a
.Fl o
flag followed by a comma separated string of options.
See the
.Xr mount 8
man page for possible options and their meanings.
.It Fl q
Use the leasing extensions to the protocol to maintain cache consistency.
This protocol, referred to as Not Quite Nfs (NQNFS),
is only supported by 4.4BSD servers.
.It Fl r
Set the read data size to the specified value.
It should be a power of 2 greater than or equal to 1024.
This should be used for UDP mounts when the
.Dq "fragments dropped due to timeout"
value is getting large while actively using a mount point.
(Use
.Xr netstat 1
with the
.Fl s
option to see what the
.Dq "fragments dropped due to timeout"
value is.)
See the
.Fl w
option as well.
.It Fl s
A soft mount, which implies that file system calls will fail
after \fBRetry\fR round trip timeout intervals.
.It Fl t
Set the initial retransmit timeout to the specified value.
May be useful for fine tuning UDP mounts over internetworks
with high packet loss rates or an overloaded server.
Try increasing the interval if
.Xr nfsstat 1
shows high retransmit rates while the file system is active or reducing the
value if there is a low retransmit rate but long response delay observed.
.It Fl w
Set the write data size to the specified value.
Ditto the comments w.r.t. the
.Fl r
option, but using the
.Dq "fragments dropped due to timeout"
value on the server instead of the client.
Note that both the
.Fl r
and
.Fl w
options should only be used as a last ditch effort at improving performance
when mounting servers that do not support TCP mounts.
.It Fl x
Set the retransmit timeout count for soft mounts to the specified value.
.El
.Sh SEE ALSO
.Xr mount 2 ,
.Xr unmount 2 ,
.Xr fstab 5 ,
.Xr mount 8
.Sh BUGS
Due to the way that Sun RPC is implemented on top of UDP (unreliable datagram)
transport, tuning such mounts is really a black art that can only be expected
to have limited success.
For clients mounting servers that are not on the same
LAN cable or that tend to be overloaded,
TCP transport is strongly recommended,
but unfortunately this is restricted to mostly 4.4BSD servers.

554
sbin/mount_nfs/mount_nfs.c Normal file
View File

@ -0,0 +1,554 @@
/*
* Copyright (c) 1992, 1993, 1994
* The Regents of the University of California. All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* Rick Macklem at The University of Guelph.
*
* 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 by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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.
*/
#ifndef lint
static char copyright[] =
"@(#) Copyright (c) 1992, 1993, 1994\n\
The Regents of the University of California. All rights reserved.\n";
#endif /* not lint */
#ifndef lint
/*static char sccsid[] = "from: @(#)mount_nfs.c 8.3 (Berkeley) 3/27/94";*/
static char *rcsid = "$Id: mount_nfs.c,v 1.1 1994/06/08 19:23:05 mycroft Exp $";
#endif /* not lint */
#include <sys/param.h>
#include <sys/mount.h>
#include <sys/socket.h>
#include <sys/socketvar.h>
#include <sys/stat.h>
#include <sys/syslog.h>
#include <rpc/rpc.h>
#include <rpc/pmap_clnt.h>
#include <rpc/pmap_prot.h>
#ifdef ISO
#include <netiso/iso.h>
#endif
#ifdef KERBEROS
#include <kerberosIV/des.h>
#include <kerberosIV/krb.h>
#endif
#include <nfs/rpcv2.h>
#include <nfs/nfsv2.h>
#define KERNEL
#include <nfs/nfs.h>
#undef KERNEL
#include <nfs/nqnfs.h>
#include <arpa/inet.h>
#include <ctype.h>
#include <err.h>
#include <errno.h>
#include <fcntl.h>
#include <netdb.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <unistd.h>
#include "mntopts.h"
struct mntopt mopts[] = {
MOPT_STDOPTS,
MOPT_FORCE,
MOPT_UPDATE,
{ NULL }
};
struct nfs_args nfsdefargs = {
(struct sockaddr *)0,
sizeof (struct sockaddr_in),
SOCK_DGRAM,
0,
(nfsv2fh_t *)0,
0,
NFS_WSIZE,
NFS_RSIZE,
NFS_TIMEO,
NFS_RETRANS,
NFS_MAXGRPS,
NFS_DEFRAHEAD,
NQ_DEFLEASE,
NQ_DEADTHRESH,
(char *)0,
};
struct nfhret {
u_long stat;
nfsv2fh_t nfh;
};
#define DEF_RETRY 10000
#define BGRND 1
#define ISBGRND 2
int retrycnt = DEF_RETRY;
int opflags = 0;
#ifdef KERBEROS
char inst[INST_SZ];
char realm[REALM_SZ];
KTEXT_ST kt;
#endif
int getnfsargs __P((char *, struct nfs_args *));
#ifdef ISO
struct iso_addr *iso_addr __P((const char *));
#endif
void set_rpc_maxgrouplist __P((int));
__dead void usage __P((void));
int xdr_dir __P((XDR *, char *));
int xdr_fh __P((XDR *, struct nfhret *));
int
main(argc, argv)
int argc;
char *argv[];
{
register int c;
register struct nfs_args *nfsargsp;
struct nfs_args nfsargs;
struct nfsd_cargs ncd;
int mntflags, i, nfssvc_flag, num;
char *name, *p, *spec;
int error = 0;
#ifdef KERBEROS
uid_t last_ruid;
#endif
#ifdef KERBEROS
last_ruid = -1;
(void)strcpy(realm, KRB_REALM);
#endif
retrycnt = DEF_RETRY;
mntflags = 0;
nfsargs = nfsdefargs;
nfsargsp = &nfsargs;
while ((c = getopt(argc, argv,
"a:bcdD:g:iKklL:Mm:o:PpqR:r:sTt:w:x:")) != EOF)
switch (c) {
case 'a':
num = strtol(optarg, &p, 10);
if (*p || num < 0)
errx(1, "illegal -a value -- %s", optarg);
nfsargsp->readahead = num;
nfsargsp->flags |= NFSMNT_READAHEAD;
break;
case 'b':
opflags |= BGRND;
break;
case 'c':
nfsargsp->flags |= NFSMNT_NOCONN;
break;
case 'D':
num = strtol(optarg, &p, 10);
if (*p || num <= 0)
errx(1, "illegal -D value -- %s", optarg);
nfsargsp->deadthresh = num;
nfsargsp->flags |= NFSMNT_DEADTHRESH;
break;
case 'd':
nfsargsp->flags |= NFSMNT_DUMBTIMR;
break;
#if 0 /* XXXX */
case 'g':
num = strtol(optarg, &p, 10);
if (*p || num <= 0)
errx(1, "illegal -g value -- %s", optarg);
set_rpc_maxgrouplist(num);
nfsargsp->maxgrouplist = num;
nfsargsp->flags |= NFSMNT_MAXGRPS;
break;
#endif
case 'i':
nfsargsp->flags |= NFSMNT_INT;
break;
#ifdef KERBEROS
case 'K':
nfsargsp->flags |= NFSMNT_KERB;
break;
#endif
case 'k':
nfsargsp->flags |= NFSMNT_NQLOOKLEASE;
break;
case 'L':
num = strtol(optarg, &p, 10);
if (*p || num < 2)
errx(1, "illegal -L value -- %s", optarg);
nfsargsp->leaseterm = num;
nfsargsp->flags |= NFSMNT_LEASETERM;
break;
case 'l':
nfsargsp->flags |= NFSMNT_RDIRALOOK;
break;
case 'M':
nfsargsp->flags |= NFSMNT_MYWRITE;
break;
#ifdef KERBEROS
case 'm':
(void)strncpy(realm, optarg, REALM_SZ - 1);
realm[REALM_SZ - 1] = '\0';
break;
#endif
case 'o':
getmntopts(optarg, mopts, &mntflags);
break;
case 'P':
nfsargsp->flags |= NFSMNT_RESVPORT;
break;
#ifdef ISO
case 'p':
nfsargsp->sotype = SOCK_SEQPACKET;
break;
#endif
case 'q':
nfsargsp->flags |= NFSMNT_NQNFS;
break;
case 'R':
num = strtol(optarg, &p, 10);
if (*p || num <= 0)
errx(1, "illegal -R value -- %s", optarg);
retrycnt = num;
break;
case 'r':
num = strtol(optarg, &p, 10);
if (*p || num <= 0)
errx(1, "illegal -r value -- %s", optarg);
nfsargsp->rsize = num;
nfsargsp->flags |= NFSMNT_RSIZE;
break;
case 's':
nfsargsp->flags |= NFSMNT_SOFT;
break;
case 'T':
nfsargsp->sotype = SOCK_STREAM;
break;
case 't':
num = strtol(optarg, &p, 10);
if (*p || num <= 0)
errx(1, "illegal -t value -- %s", optarg);
nfsargsp->timeo = num;
nfsargsp->flags |= NFSMNT_TIMEO;
break;
case 'w':
num = strtol(optarg, &p, 10);
if (*p || num <= 0)
errx(1, "illegal -w value -- %s", optarg);
nfsargsp->wsize = num;
nfsargsp->flags |= NFSMNT_WSIZE;
break;
case 'x':
num = strtol(optarg, &p, 10);
if (*p || num <= 0)
errx(1, "illegal -x value -- %s", optarg);
nfsargsp->retrans = num;
nfsargsp->flags |= NFSMNT_RETRANS;
break;
default:
usage();
break;
}
argc -= optind;
argv += optind;
if (argc != 2)
error = 1;
spec = *argv++;
name = *argv;
if (!getnfsargs(spec, nfsargsp))
exit(1);
if (mount(MOUNT_NFS, name, mntflags, nfsargsp))
err(1, "%s", name);
if (nfsargsp->flags & (NFSMNT_NQNFS | NFSMNT_KERB)) {
if ((opflags & ISBGRND) == 0) {
if (i = fork()) {
if (i == -1)
err(1, "nqnfs 1");
exit(0);
}
(void) setsid();
(void) close(STDIN_FILENO);
(void) close(STDOUT_FILENO);
(void) close(STDERR_FILENO);
(void) chdir("/");
}
openlog("mount_nfs:", LOG_PID, LOG_DAEMON);
nfssvc_flag = NFSSVC_MNTD;
ncd.ncd_dirp = name;
while (nfssvc(nfssvc_flag, (caddr_t)&ncd) < 0) {
if (errno != ENEEDAUTH) {
syslog(LOG_ERR, "nfssvc err %m");
continue;
}
nfssvc_flag =
NFSSVC_MNTD | NFSSVC_GOTAUTH | NFSSVC_AUTHINFAIL;
#ifdef KERBEROS
/*
* Set up as ncd_authuid for the kerberos call.
* Must set ruid to ncd_authuid and reset the
* ticket name iff ncd_authuid is not the same
* as last time, so that the right ticket file
* is found.
*/
if (ncd.ncd_authuid != last_ruid) {
krb_set_tkt_string("");
last_ruid = ncd.ncd_authuid;
}
setreuid(ncd.ncd_authuid, 0);
if (krb_mk_req(&kt, "rcmd", inst, realm, 0) ==
KSUCCESS &&
kt.length <= (RPCAUTH_MAXSIZ - 2 * NFSX_UNSIGNED)) {
ncd.ncd_authtype = RPCAUTH_NQNFS;
ncd.ncd_authlen = kt.length;
ncd.ncd_authstr = (char *)kt.dat;
nfssvc_flag = NFSSVC_MNTD | NFSSVC_GOTAUTH;
}
setreuid(0, 0);
#endif /* KERBEROS */
}
}
exit(0);
}
int
getnfsargs(spec, nfsargsp)
char *spec;
struct nfs_args *nfsargsp;
{
register CLIENT *clp;
struct hostent *hp;
static struct sockaddr_in saddr;
#ifdef ISO
static struct sockaddr_iso isoaddr;
struct iso_addr *isop;
int isoflag = 0;
#endif
struct timeval pertry, try;
enum clnt_stat clnt_stat;
int so = RPC_ANYSOCK, i;
char *hostp, *delimp;
#ifdef KERBEROS
char *cp;
#endif
u_short tport;
static struct nfhret nfhret;
static char nam[MNAMELEN + 1];
strncpy(nam, spec, MNAMELEN);
nam[MNAMELEN] = '\0';
if ((delimp = strchr(spec, '@')) != NULL) {
hostp = delimp + 1;
} else if ((delimp = strchr(spec, ':')) != NULL) {
hostp = spec;
spec = delimp + 1;
} else {
warnx("no <host>:<dirpath> or <dirpath>@<host> spec");
return (0);
}
*delimp = '\0';
/*
* DUMB!! Until the mount protocol works on iso transport, we must
* supply both an iso and an inet address for the host.
*/
#ifdef ISO
if (!strncmp(hostp, "iso=", 4)) {
u_short isoport;
hostp += 4;
isoflag++;
if ((delimp = strchr(hostp, '+')) == NULL) {
warnx("no iso+inet address");
return (0);
}
*delimp = '\0';
if ((isop = iso_addr(hostp)) == NULL) {
warnx("bad ISO address");
return (0);
}
bzero((caddr_t)&isoaddr, sizeof (isoaddr));
bcopy((caddr_t)isop, (caddr_t)&isoaddr.siso_addr,
sizeof (struct iso_addr));
isoaddr.siso_len = sizeof (isoaddr);
isoaddr.siso_family = AF_ISO;
isoaddr.siso_tlen = 2;
isoport = htons(NFS_PORT);
bcopy((caddr_t)&isoport, TSEL(&isoaddr), isoaddr.siso_tlen);
hostp = delimp + 1;
}
#endif /* ISO */
/*
* Handle an internet host address and reverse resolve it if
* doing Kerberos.
*/
if (isdigit(*hostp)) {
if ((saddr.sin_addr.s_addr = inet_addr(hostp)) == -1) {
warnx("bad net address %s", hostp);
return (0);
}
if ((nfsargsp->flags & NFSMNT_KERB) &&
(hp = gethostbyaddr((char *)&saddr.sin_addr.s_addr,
sizeof (u_long), AF_INET)) == (struct hostent *)0) {
warnx("can't reverse resolve net address");
return (0);
}
} else if ((hp = gethostbyname(hostp)) == NULL) {
warnx("can't get net id for host");
return (0);
}
#ifdef KERBEROS
if (nfsargsp->flags & NFSMNT_KERB) {
strncpy(inst, hp->h_name, INST_SZ);
inst[INST_SZ - 1] = '\0';
if (cp = strchr(inst, '.'))
*cp = '\0';
}
#endif /* KERBEROS */
bcopy(hp->h_addr, (caddr_t)&saddr.sin_addr, hp->h_length);
nfhret.stat = EACCES; /* Mark not yet successful */
while (retrycnt > 0) {
saddr.sin_family = AF_INET;
saddr.sin_port = htons(PMAPPORT);
if ((tport = pmap_getport(&saddr, RPCPROG_NFS,
NFS_VER2, IPPROTO_UDP)) == 0) {
if ((opflags & ISBGRND) == 0)
clnt_pcreateerror("NFS Portmap");
} else {
saddr.sin_port = 0;
pertry.tv_sec = 10;
pertry.tv_usec = 0;
if ((clp = clntudp_create(&saddr, RPCPROG_MNT,
RPCMNT_VER1, pertry, &so)) == NULL) {
if ((opflags & ISBGRND) == 0)
clnt_pcreateerror("Cannot MNT PRC");
} else {
clp->cl_auth = authunix_create_default();
try.tv_sec = 10;
try.tv_usec = 0;
clnt_stat = clnt_call(clp, RPCMNT_MOUNT,
xdr_dir, spec, xdr_fh, &nfhret, try);
if (clnt_stat != RPC_SUCCESS) {
if ((opflags & ISBGRND) == 0)
warnx("%s", clnt_sperror(clp,
"bad MNT RPC"));
} else {
auth_destroy(clp->cl_auth);
clnt_destroy(clp);
retrycnt = 0;
}
}
}
if (--retrycnt > 0) {
if (opflags & BGRND) {
opflags &= ~BGRND;
if (i = fork()) {
if (i == -1)
err(1, "nqnfs 2");
exit(0);
}
(void) setsid();
(void) close(STDIN_FILENO);
(void) close(STDOUT_FILENO);
(void) close(STDERR_FILENO);
(void) chdir("/");
opflags |= ISBGRND;
}
sleep(60);
}
}
if (nfhret.stat) {
if (opflags & ISBGRND)
exit(1);
warn("can't access %s", spec);
return (0);
}
saddr.sin_port = htons(tport);
#ifdef ISO
if (isoflag) {
nfsargsp->addr = (struct sockaddr *) &isoaddr;
nfsargsp->addrlen = sizeof (isoaddr);
} else
#endif /* ISO */
{
nfsargsp->addr = (struct sockaddr *) &saddr;
nfsargsp->addrlen = sizeof (saddr);
}
nfsargsp->fh = &nfhret.nfh;
nfsargsp->hostname = nam;
return (1);
}
/*
* xdr routines for mount rpc's
*/
int
xdr_dir(xdrsp, dirp)
XDR *xdrsp;
char *dirp;
{
return (xdr_string(xdrsp, &dirp, RPCMNT_PATHLEN));
}
int
xdr_fh(xdrsp, np)
XDR *xdrsp;
struct nfhret *np;
{
if (!xdr_u_long(xdrsp, &(np->stat)))
return (0);
if (np->stat)
return (1);
return (xdr_opaque(xdrsp, (caddr_t)&(np->nfh), NFSX_FH));
}
__dead void
usage()
{
(void)fprintf(stderr, "usage: mount_nfs %s\n%s\n%s\n%s\n",
"[-bcdiKklMPqsT] [-a maxreadahead] [-D deadthresh]",
"\t[-g maxgroups] [-L leaseterm] [-m realm] [-o options] [-R retrycnt]",
"\t[-r readsize] [-t timeout] [-w writesize] [-x retrans]",
"\trhost:path node");
exit(1);
}

12
sbin/mount_null/Makefile Normal file
View File

@ -0,0 +1,12 @@
# from: @(#)Makefile 8.3 (Berkeley) 3/27/94
# $Id: Makefile,v 1.1 1994/06/08 19:23:42 mycroft Exp $
PROG= mount_null
SRCS= mount_null.c getmntopts.c
MAN8= mount_null.0
MOUNT= ${.CURDIR}/../mount
CFLAGS+= -I/sys -I${MOUNT}
.PATH: ${MOUNT}
.include <bsd.prog.mk>

View File

@ -0,0 +1,220 @@
.\"
.\" Copyright (c) 1992, 1993, 1994
.\" The Regents of the University of California. All rights reserved.
.\"
.\" This code is derived from software donated to Berkeley by
.\" John Heidemann of the UCLA Ficus project.
.\"
.\"
.\" 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 by the University of
.\" California, Berkeley and its contributors.
.\" 4. Neither the name of the University nor the names of its contributors
.\" may be used to endorse or promote products derived from this software
.\" without specific prior written permission.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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.
.\"
.\" from: @(#)mount_null.8 8.4 (Berkeley) 4/19/94
.\" $Id: mount_null.8,v 1.1 1994/06/08 19:23:43 mycroft Exp $
.\"
.Dd April 19, 1994
.Dt MOUNT_NULL 8
.Os BSD 4.4
.Sh NAME
.Nm mount_null
.Nd demonstrate the use of a null file system layer
.Sh SYNOPSIS
.Nm mount_null
.Op Fl o Ar options
.Ar target
.Ar mount-point
.Sh DESCRIPTION
The
.Nm mount_null
command creates a
null layer, duplicating a sub-tree of the file system
name space under another part of the global file system namespace.
In this respect, it is
similar to the loopback file system (see
.Xr mount_lofs 8 ) .
It differs from
the loopback file system in two respects: it is implemented using
a stackable layers techniques, and it's
.Do
null-node
.Dc s
stack above
all lower-layer vnodes, not just over directory vnodes.
.Pp
The options are as follows:
.Bl -tag -width indent
.It Fl o
Options are specified with a
.Fl o
flag followed by a comma separated string of options.
See the
.Xr mount 8
man page for possible options and their meanings.
.El
.Pp
The null layer has two purposes.
First, it serves as a demonstration of layering by proving a layer
which does nothing.
(It actually does everything the loopback file system does,
which is slightly more than nothing.)
Second, the null layer can serve as a prototype layer.
Since it provides all necessary layer framework,
new file system layers can be created very easily be starting
with a null layer.
.Pp
The remainder of this man page examines the null layer as a basis
for constructing new layers.
.\"
.\"
.Sh INSTANTIATING NEW NULL LAYERS
New null layers are created with
.Xr mount_null 8 .
.Xr Mount_null 8
takes two arguments, the pathname
of the lower vfs (target-pn) and the pathname where the null
layer will appear in the namespace (mount-point-pn). After
the null layer is put into place, the contents
of target-pn subtree will be aliased under mount-point-pn.
.\"
.\"
.Sh OPERATION OF A NULL LAYER
The null layer is the minimum file system layer,
simply bypassing all possible operations to the lower layer
for processing there. The majority of its activity centers
on the bypass routine, though which nearly all vnode operations
pass.
.Pp
The bypass routine accepts arbitrary vnode operations for
handling by the lower layer. It begins by examing vnode
operation arguments and replacing any null-nodes by their
lower-layer equivalents. It then invokes the operation
on the lower layer. Finally, it replaces the null-nodes
in the arguments and, if a vnode is returned by the operation,
stacks a null-node on top of the returned vnode.
.Pp
Although bypass handles most operations,
.Em vop_getattr ,
.Em vop_inactive ,
.Em vop_reclaim ,
and
.Em vop_print
are not bypassed.
.Em Vop_getattr
must change the fsid being returned.
.Em Vop_inactive
and vop_reclaim are not bypassed so that
they can handle freeing null-layer specific data.
.Em Vop_print
is not bypassed to avoid excessive debugging
information.
.\"
.\"
.Sh INSTANTIATING VNODE STACKS
Mounting associates the null layer with a lower layer,
in effect stacking two VFSes. Vnode stacks are instead
created on demand as files are accessed.
.Pp
The initial mount creates a single vnode stack for the
root of the new null layer. All other vnode stacks
are created as a result of vnode operations on
this or other null vnode stacks.
.Pp
New vnode stacks come into existence as a result of
an operation which returns a vnode.
The bypass routine stacks a null-node above the new
vnode before returning it to the caller.
.Pp
For example, imagine mounting a null layer with
.Bd -literal -offset indent
mount_null /usr/include /dev/layer/null
.Ed
Changing directory to
.Pa /dev/layer/null
will assign
the root null-node (which was created when the null layer was mounted).
Now consider opening
.Pa sys .
A vop_lookup would be
done on the root null-node. This operation would bypass through
to the lower layer which would return a vnode representing
the UFS
.Pa sys .
Null_bypass then builds a null-node
aliasing the UFS
.Pa sys
and returns this to the caller.
Later operations on the null-node
.Pa sys
will repeat this
process when constructing other vnode stacks.
.\"
.\"
.Sh CREATING OTHER FILE SYSTEM LAYERS
One of the easiest ways to construct new file system layers is to make
a copy of the null layer, rename all files and variables, and
then begin modifyng the copy. Sed can be used to easily rename
all variables.
.Pp
The umap layer is an example of a layer descended from the
null layer.
.\"
.\"
.Sh INVOKING OPERATIONS ON LOWER LAYERS
There are two techniques to invoke operations on a lower layer
when the operation cannot be completely bypassed. Each method
is appropriate in different situations. In both cases,
it is the responsibility of the aliasing layer to make
the operation arguments "correct" for the lower layer
by mapping an vnode arguments to the lower layer.
.Pp
The first approach is to call the aliasing layer's bypass routine.
This method is most suitable when you wish to invoke the operation
currently being handled on the lower layer. It has the advantage
the the bypass routine already must do argument mapping.
An example of this is
.Em null_getattrs
in the null layer.
.Pp
A second approach is to directly invoked vnode operations on
the lower layer with the
.Em VOP_OPERATIONNAME
interface.
The advantage of this method is that it is easy to invoke
arbitrary operations on the lower layer. The disadvantage
is that vnodes arguments must be manually mapped.
.\"
.\"
.Sh SEE ALSO
.Xr mount 8
.sp
UCLA Technical Report CSD-910056,
.Em "Stackable Layers: an Architecture for File System Development" .
.Sh HISTORY
The
.Nm mount_null
utility first appeared in 4.4BSD.

View File

@ -0,0 +1,130 @@
/*
* Copyright (c) 1992, 1993, 1994
* The Regents of the University of California. All rights reserved.
*
* This code is derived from software donated to Berkeley by
* Jan-Simon Pendry.
*
* 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 by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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.
*/
#ifndef lint
char copyright[] =
"@(#) Copyright (c) 1992, 1993, 1994\n\
The Regents of the University of California. All rights reserved.\n";
#endif /* not lint */
#ifndef lint
/*static char sccsid[] = "from: @(#)mount_null.c 8.5 (Berkeley) 3/27/94";*/
static char *rcsid = "$Id: mount_null.c,v 1.1 1994/06/08 19:23:44 mycroft Exp $";
#endif /* not lint */
#include <sys/param.h>
#include <sys/mount.h>
#include <miscfs/nullfs/null.h>
#include <err.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include "mntopts.h"
struct mntopt mopts[] = {
MOPT_STDOPTS,
{ NULL }
};
int subdir __P((const char *, const char *));
void usage __P((void));
int
main(argc, argv)
int argc;
char *argv[];
{
struct null_args args;
int ch, mntflags;
char target[MAXPATHLEN];
mntflags = 0;
while ((ch = getopt(argc, argv, "o:")) != EOF)
switch(ch) {
case 'o':
getmntopts(optarg, mopts, &mntflags);
break;
case '?':
default:
usage();
}
argc -= optind;
argv += optind;
if (argc != 2)
usage();
if (realpath(argv[0], target) == 0)
err(1, "%s", target);
if (subdir(target, argv[1]) || subdir(argv[1], target))
errx(1, "%s (%s) and %s are not distinct paths",
argv[0], target, argv[1]);
args.target = target;
if (mount(MOUNT_NULL, argv[1], mntflags, &args))
err(1, NULL);
exit(0);
}
int
subdir(p, dir)
const char *p;
const char *dir;
{
int l;
l = strlen(dir);
if (l <= 1)
return (1);
if ((strncmp(p, dir, l) == 0) && (p[l] == '/' || p[l] == '\0'))
return (1);
return (0);
}
void
usage()
{
(void)fprintf(stderr,
"usage: mount_null [-o options] target_fs mount_point\n");
exit(1);
}

View File

@ -1,17 +1,16 @@
# from: @(#)Makefile 8.1 (Berkeley) 6/5/93
# $Id: Makefile,v 1.5 1994/01/28 00:33:38 cgd Exp $
.if exists(${.CURDIR}/../../sys)
CFLAGS+=-I${.CURDIR}/../../sys
.else
CFLAGS+=-I/sys
.endif
# from: @(#)Makefile 8.3 (Berkeley) 3/27/94
# $Id: Makefile,v 1.6 1994/06/08 19:24:44 mycroft Exp $
PROG= mount_portal
PTAL= pt_conf.c pt_exec.c pt_file.c pt_tcp.c
SRCS= mount_portal.c conf.c activate.c ${PTAL}
SRCS= mount_portal.c activate.c conf.c getmntopts.c pt_conf.c \
pt_exec.c pt_file.c pt_tcp.c
MAN8= mount_portal.0
LDADD+= -lcompat
DPADD+= ${LIBCOMPAT}
MOUNT= ${.CURDIR}/../mount
CFLAGS+= -I/sys -I${MOUNT}
.PATH: ${MOUNT}
DPADD= $(LIBCOMPAT)
LDADD= -lcompat
.include <bsd.prog.mk>

View File

@ -34,9 +34,9 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* from: Id: activate.c,v 1.2 1992/05/27 07:09:27 jsp Exp jsp
* from: @(#)activate.c 8.1 (Berkeley) 6/5/93
* $Id: activate.c,v 1.1 1994/01/12 20:01:32 cgd Exp $
* from: Id: activate.c,v 1.2 1992/05/27 07:09:27 jsp Exp
* from: @(#)activate.c 8.2 (Berkeley) 3/27/94
* $Id: activate.c,v 1.2 1994/06/08 19:24:45 mycroft Exp $
*/
#include <stdio.h>
@ -171,7 +171,6 @@ int so;
{
struct portal_cred pcred;
char key[MAXPATHLEN+1];
int n;
int error;
char **v;
int fd = -1;

View File

@ -34,9 +34,9 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* from: Id: conf.c,v 1.2 1992/05/27 07:09:27 jsp Exp jsp
* from: @(#)conf.c 8.1 (Berkeley) 6/5/93
* $Id: conf.c,v 1.1 1994/01/12 20:01:33 cgd Exp $
* from: Id: conf.c,v 1.2 1992/05/27 07:09:27 jsp Exp
* from: @(#)conf.c 8.2 (Berkeley) 3/27/94
* $Id: conf.c,v 1.2 1994/06/08 19:24:46 mycroft Exp $
*/
#include <stdio.h>
@ -240,7 +240,7 @@ qelem *xq;
* and free it.
*/
while (q0->q_forw != q0) {
qelem *q = q->q_forw;
qelem *q = q0->q_forw;
rem_que(q);
pfree((path *) q);
}

View File

@ -1,5 +1,5 @@
.\"
.\" Copyright (c) 1993
.\" Copyright (c) 1993, 1994
.\" The Regents of the University of California. All rights reserved.
.\" All rights reserved.
.\"
@ -34,10 +34,10 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\" from: @(#)mount_portal.8 8.2 (Berkeley) 12/16/93
.\" $Id: mount_portal.8,v 1.2 1994/01/24 19:26:13 jtc Exp $
.\" from: @(#)mount_portal.8 8.3 (Berkeley) 3/27/94
.\" $Id: mount_portal.8,v 1.3 1994/06/08 19:24:47 mycroft Exp $
.\"
.Dd December 16, 1993
.Dd March 27, 1994
.Dt MOUNT_PORTAL 8
.Os BSD 4.4
.Sh NAME
@ -45,9 +45,9 @@
.Nd mount the portal daemon
.Sh SYNOPSIS
.Nm mount_portal
.Op Fl F Ar fsoptions
.Pa /etc/portal.conf
.Pa mount_point
.Op Fl o Ar options
.Ar /etc/portal.conf
.Ar mount_point
.Sh DESCRIPTION
The
.Nm mount_portal
@ -55,10 +55,22 @@ command attaches an instance of the portal daemon
to the global filesystem namespace.
The conventional mount point is
.Pa /p .
.PA /dev .
This command is normally executed by
.Xr mount 8
at boot time.
.Pp
The options are as follows:
.Bl -tag -width indent
.It Fl o
Options are specified with a
.Fl o
flag followed by a comma separated string of options.
See the
.Xr mount 8
man page for possible options and their meanings.
.El
.Pp
The portal daemon provides an
.Em open
service.
@ -114,7 +126,8 @@ fs/ file fs/
.Sh SEE ALSO
.Xr mount 2 ,
.Xr unmount 2 ,
.Xr fstab 5
.Xr fstab 5 ,
.Xr mount 8
.Sh CAVEATS
This filesystem may not be NFS-exported.
.Sh HISTORY

View File

@ -1,7 +1,6 @@
/*
* Copyright (c) 1992, 1993
* Copyright (c) 1992, 1993, 1994
* The Regents of the University of California. All rights reserved.
* All rights reserved.
*
* This code is derived from software donated to Berkeley by
* Jan-Simon Pendry.
@ -33,19 +32,19 @@
* 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.
*
* from: Id: portald.c,v 1.3 1992/05/27 07:09:27 jsp Exp jsp
* from: @(#)mount_portal.c 8.1 (Berkeley) 6/5/93
* $Id: mount_portal.c,v 1.2 1994/01/13 17:45:37 mycroft Exp $
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <signal.h>
#include <sys/types.h>
#ifndef lint
char copyright[] =
"@(#) Copyright (c) 1992, 1993, 1994\n\
The Regents of the University of California. All rights reserved.\n";
#endif /* not lint */
#ifndef lint
/*static char sccsid[] = "from: @(#)mount_portal.c 8.4 (Berkeley) 3/27/94";*/
static char *rcsid = "$Id: mount_portal.c,v 1.3 1994/06/08 19:24:48 mycroft Exp $";
#endif /* not lint */
#include <sys/param.h>
#include <sys/wait.h>
#include <sys/socket.h>
@ -53,9 +52,25 @@
#include <sys/syslog.h>
#include <sys/mount.h>
#include <err.h>
#include <errno.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "mntopts.h"
#include "pathnames.h"
#include "portald.h"
struct mntopt mopts[] = {
MOPT_STDOPTS,
{ NULL }
};
static void usage __P((void));
static sig_atomic_t readcf; /* Set when SIGHUP received */
static void sigchld(sig)
@ -65,55 +80,54 @@ int sig;
while ((pid = waitpid((pid_t) -1, (int *) 0, WNOHANG)) > 0)
;
if (pid < 0)
if (pid < 0 && errno != ECHILD)
syslog(LOG_WARNING, "waitpid: %s", strerror(errno));
}
int main(c, v)
int c;
char *v[];
int
main(argc, argv)
int argc;
char *argv[];
{
struct portal_args args;
struct sockaddr_un un;
char *conf;
char *mountpt;
int mntflags = 0;
int usage = 0;
char tag[32];
qelem q;
int rc;
int so;
int error = 0;
/*
* Crack command line args
*/
int ch;
while ((ch = getopt(c, v, "F:")) != EOF) {
while ((ch = getopt(argc, argv, "o:")) != EOF) {
switch (ch) {
case 'F':
mntflags = atoi(optarg);
case 'o':
getmntopts(optarg, mopts, &mntflags);
break;
default:
usage = 1;
error = 1;
break;
}
}
if (optind != (c - 2))
usage = 1;
if (optind != (argc - 2))
error = 1;
if (usage) {
fprintf(stderr, "Usage: mount_portal [ fsoptions ] config mount-point\n");
exit(1);
}
if (error)
usage();
/*
* Get config file and mount point
*/
conf = v[optind];
mountpt = v[optind+1];
conf = argv[optind];
mountpt = argv[optind+1];
/*
* Construct the listening socket
@ -133,10 +147,8 @@ char *v[];
exit(1);
}
(void) unlink(un.sun_path);
if (bind(so, (struct sockaddr *) &un, sizeof(un)) < 0) {
fprintf(stderr, "mount_portal: bind: %s\n", strerror(errno));
exit(1);
}
if (bind(so, (struct sockaddr *) &un, sizeof(un)) < 0)
err(1, NULL);
(void) unlink(un.sun_path);
(void) listen(so, 5);
@ -146,10 +158,8 @@ char *v[];
args.pa_config = tag;
rc = mount(MOUNT_PORTAL, mountpt, mntflags, &args);
if (rc < 0) {
fprintf(stderr, "mount_portal: mount: %s\n", strerror(errno));
exit(1);
}
if (rc < 0)
err(1, NULL);
/*
* Everything is ready to go - now is a good time to fork
@ -231,13 +241,20 @@ char *v[];
case 0:
(void) close(so);
activate(&q, so2);
break;
exit(0);
default:
(void) close(so2);
break;
}
activate(&q, so2);
}
syslog(LOG_INFO, "%s unmounted", mountpt);
exit(0);
}
static void
usage()
{
(void)fprintf(stderr,
"usage: mount_portal [-o options] config mount-point\n");
exit(1);
}

View File

@ -34,9 +34,9 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* from: Id: pathnames.h,v 1.2 1992/05/27 07:09:27 jsp Exp jsp
* from: Id: pathnames.h,v 1.2 1992/05/27 07:09:27 jsp Exp
* from: @(#)pathnames.h 8.1 (Berkeley) 6/5/93
* $Id: pathnames.h,v 1.1 1994/01/12 20:01:48 cgd Exp $
* $Id: pathnames.h,v 1.2 1994/06/08 19:24:49 mycroft Exp $
*/
#include <paths.h>

View File

@ -1,6 +1,6 @@
# from: Id: portal.conf,v 1.1 1992/05/27 06:50:13 jsp Exp jsp
# from: Id: portal.conf,v 1.1 1992/05/27 06:50:13 jsp Exp
# from: @(#)portal.conf 8.1 (Berkeley) 6/5/93
# $Id: portal.conf,v 1.1 1994/01/12 20:01:54 cgd Exp $
# $Id: portal.conf,v 1.2 1994/06/08 19:24:50 mycroft Exp $
tcplisten/ tcplisten tcplisten/
tcp/ tcp tcp/
fs/ file fs/

View File

@ -34,9 +34,9 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* from: Id: portald.h,v 1.1 1992/05/25 21:43:09 jsp Exp jsp
* from: Id: portald.h,v 1.1 1992/05/25 21:43:09 jsp Exp
* from: @(#)portald.h 8.1 (Berkeley) 6/5/93
* $Id: portald.h,v 1.1 1994/01/12 20:02:06 cgd Exp $
* $Id: portald.h,v 1.2 1994/06/08 19:24:52 mycroft Exp $
*/
#include <sys/cdefs.h>

View File

@ -34,9 +34,9 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* from: Id: pt_conf.c,v 1.2 1992/05/27 07:09:27 jsp Exp jsp
* from: Id: pt_conf.c,v 1.2 1992/05/27 07:09:27 jsp Exp
* from: @(#)pt_conf.c 8.1 (Berkeley) 6/5/93
* $Id: pt_conf.c,v 1.1 1994/01/12 20:02:08 cgd Exp $
* $Id: pt_conf.c,v 1.2 1994/06/08 19:24:53 mycroft Exp $
*/
#include <sys/types.h>

View File

@ -34,9 +34,9 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* from: Id: pt_exec.c,v 1.1 1992/05/25 21:43:09 jsp Exp jsp
* from: Id: pt_exec.c,v 1.1 1992/05/25 21:43:09 jsp Exp
* from: @(#)pt_exec.c 8.1 (Berkeley) 6/5/93
* $Id: pt_exec.c,v 1.1 1994/01/12 20:02:18 cgd Exp $
* $Id: pt_exec.c,v 1.2 1994/06/08 19:24:54 mycroft Exp $
*/
#include <stdio.h>

View File

@ -34,14 +34,15 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* from: Id: pt_file.c,v 1.1 1992/05/25 21:43:09 jsp Exp jsp
* from: @(#)pt_file.c 8.1 (Berkeley) 6/5/93
* $Id: pt_file.c,v 1.2 1994/04/13 07:33:05 cgd Exp $
* from: Id: pt_file.c,v 1.1 1992/05/25 21:43:09 jsp Exp
* from: @(#)pt_file.c 8.2 (Berkeley) 3/27/94
* $Id: pt_file.c,v 1.3 1994/06/08 19:24:55 mycroft Exp $
*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/types.h>
@ -58,7 +59,6 @@ int so;
int *fdp;
{
int fd;
int gid;
char pbuf[MAXPATHLEN];
int error;
gid_t gidset[NGROUPS];

View File

@ -34,9 +34,9 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* from: Id: pt_tcp.c,v 1.1 1992/05/25 21:43:09 jsp Exp jsp
* from: @(#)pt_tcp.c 8.2 (Berkeley) 1/14/94
* $Id: pt_tcp.c,v 1.4 1994/05/30 09:55:56 mycroft Exp $
* from: Id: pt_tcp.c,v 1.1 1992/05/25 21:43:09 jsp Exp
* from: @(#)pt_tcp.c 8.3 (Berkeley) 3/27/94
* $Id: pt_tcp.c,v 1.5 1994/06/08 19:24:56 mycroft Exp $
*/
#include <stdio.h>
@ -49,6 +49,7 @@
#include <sys/syslog.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include "portald.h"

View File

@ -1,7 +1,12 @@
# $Id: Makefile,v 1.3 1994/01/12 20:21:45 cgd Exp $
# from: @(#)Makefile 8.4 (Berkeley) 3/27/94
# $Id: Makefile,v 1.4 1994/06/08 19:25:35 mycroft Exp $
PROG= mount_procfs
#MAN8= mount_procfs.0
NOMAN=
SRCS= mount_procfs.c getmntopts.c
MAN8= mount_procfs.0
MOUNT= ${.CURDIR}/../mount
CFLAGS+= -I${MOUNT}
.PATH: ${MOUNT}
.include <bsd.prog.mk>

View File

@ -1,6 +1,6 @@
/*
* Copyright (c) 1990, 1992, 1993 Jan-Simon Pendry
* Copyright (c) 1992, 1993
* Copyright (c) 1992, 1993, 1994
* The Regents of the University of California. All rights reserved.
*
* This code is derived from software contributed to Berkeley by
@ -33,21 +33,36 @@
* 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.
*
* from: @(#)mount_procfs.c 8.1 (Berkeley) 1/11/94
* $Id: mount_procfs.c,v 1.4 1994/01/12 20:21:50 cgd Exp $
*/
#ifndef lint
char copyright[] =
"@(#) Copyright (c) 1992, 1993, 1994\n\
The Regents of the University of California. All rights reserved.\n";
#endif /* not lint */
#ifndef lint
/*static char sccsid[] = "from: @(#)mount_procfs.c 8.3 (Berkeley) 3/27/94";*/
static char *rcsid = "$Id: mount_procfs.c,v 1.5 1994/06/08 19:25:36 mycroft Exp $";
#endif /* not lint */
#include <sys/param.h>
#include <sys/mount.h>
#include <errno.h>
#include <err.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void usage __P((void));
#include "mntopts.h"
struct mntopt mopts[] = {
MOPT_STDOPTS,
{ NULL }
};
void usage __P((void));
int
main(argc, argv)
@ -57,10 +72,10 @@ main(argc, argv)
int ch, mntflags;
mntflags = 0;
while ((ch = getopt(argc, argv, "F:")) != EOF)
switch(ch) {
case 'F':
mntflags = atoi(optarg);
while ((ch = getopt(argc, argv, "o:")) != EOF)
switch (ch) {
case 'o':
getmntopts(optarg, mopts, &mntflags);
break;
case '?':
default:
@ -72,10 +87,8 @@ main(argc, argv)
if (argc != 2)
usage();
if (mount(MOUNT_PROCFS, argv[1], mntflags, NULL)) {
(void)fprintf(stderr, "mount_fdesc: %s\n", strerror(errno));
exit(1);
}
if (mount(MOUNT_PROCFS, argv[1], mntflags, NULL))
err(1, NULL);
exit(0);
}
@ -83,6 +96,6 @@ void
usage()
{
(void)fprintf(stderr,
"usage: mount_procfs [ -F fsoptions ] /proc mount_point\n");
"usage: mount_procfs [-o options] /proc mount_point\n");
exit(1);
}