Update from 4.4-Lite, with local changes.
This commit is contained in:
parent
cf6f15bde0
commit
5922d844af
12
sbin/mount_nfs/Makefile
Normal file
12
sbin/mount_nfs/Makefile
Normal 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
223
sbin/mount_nfs/mount_nfs.8
Normal 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
554
sbin/mount_nfs/mount_nfs.c
Normal 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
12
sbin/mount_null/Makefile
Normal 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>
|
220
sbin/mount_null/mount_null.8
Normal file
220
sbin/mount_null/mount_null.8
Normal 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.
|
130
sbin/mount_null/mount_null.c
Normal file
130
sbin/mount_null/mount_null.c
Normal 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);
|
||||
}
|
@ -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>
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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>
|
||||
|
@ -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/
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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];
|
||||
|
@ -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"
|
||||
|
@ -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>
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user