mirror of
https://git.FreeBSD.org/src.git
synced 2025-01-02 12:20:51 +00:00
Attempt to import Lite2's mount.
This commit is contained in:
parent
08f68ac6a6
commit
92e2d9bed5
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/vendor/CSRG/dist/; revision=23412
8
sbin/mount/Makefile
Normal file
8
sbin/mount/Makefile
Normal file
@ -0,0 +1,8 @@
|
||||
# @(#)Makefile 8.6 (Berkeley) 5/8/95
|
||||
|
||||
PROG= mount
|
||||
SRCS= mount.c mount_ufs.c getmntopts.c vfslist.c
|
||||
MAN8= mount.0
|
||||
# We do NOT install the getmntopts.3 man page.
|
||||
|
||||
.include <bsd.prog.mk>
|
179
sbin/mount/getmntopts.3
Normal file
179
sbin/mount/getmntopts.3
Normal file
@ -0,0 +1,179 @@
|
||||
.\" Copyright (c) 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.
|
||||
.\"
|
||||
.\" @(#)getmntopts.3 8.3 (Berkeley) 3/30/95
|
||||
.\"
|
||||
.Dd March 30, 1995
|
||||
.Dt GETMNTOPTS 3
|
||||
.Os BSD 4.4
|
||||
.Sh NAME
|
||||
.Nm getmntopts
|
||||
.Nd scan mount options
|
||||
.Sh SYNOPSIS
|
||||
.Fd #include <mntopts.h>
|
||||
.Ft void
|
||||
.Fn getmntopts "char *options" "struct mntopt *mopts" "int *flagp" "int *altflagp"
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm getmntopts
|
||||
function takes a comma separated option list and a list
|
||||
of valid option names, and computes the bitmask
|
||||
corresponding to the requested set of options.
|
||||
.Pp
|
||||
The string
|
||||
.Dv options
|
||||
is broken down into a sequence of comma separated tokens.
|
||||
Each token is looked up in the table described by
|
||||
.Dv mopts
|
||||
and the bits in
|
||||
the word referenced by either
|
||||
.Dv flagp
|
||||
or
|
||||
.Dv altflagp
|
||||
(depending on the
|
||||
.Dv m_altloc
|
||||
field of the option's table entry)
|
||||
are updated.
|
||||
The flag words are not initialized by
|
||||
.Nm getmntopt .
|
||||
The table,
|
||||
.Dv mopts ,
|
||||
has the following format:
|
||||
.Bd -literal
|
||||
struct mntopt {
|
||||
char *m_option; /* option name */
|
||||
int m_inverse; /* is this a negative option, eg "dev" */
|
||||
int m_flag; /* bit to set, eg MNT_RDONLY */
|
||||
int m_altloc; /* non-zero to use altflagp rather than flagp */
|
||||
};
|
||||
.Ed
|
||||
.Pp
|
||||
The members of this structure are:
|
||||
.Bl -tag -width m_inverse
|
||||
.It Fa m_option
|
||||
the option name,
|
||||
for example
|
||||
.Dq suid .
|
||||
.It Fa m_inverse
|
||||
tells
|
||||
.Nm getmntopts
|
||||
that the name has the inverse meaning of the
|
||||
bit.
|
||||
For example,
|
||||
.Dq suid
|
||||
is the string, whereas the
|
||||
mount flag is
|
||||
.Dv MNT_NOSUID .
|
||||
In this case, the sense of the string and the flag
|
||||
are inverted, so the
|
||||
.Dv m_inverse
|
||||
flag should be set.
|
||||
.It Fa m_flag
|
||||
the value of the bit to be set or cleared in
|
||||
the flag word when the option is recognized.
|
||||
The bit is set when the option is discovered,
|
||||
but cleared if the option name was preceded
|
||||
by the letters
|
||||
.Dq no .
|
||||
The
|
||||
.Dv m_inverse
|
||||
flag causes these two operations to be reversed.
|
||||
.It Fa m_altloc
|
||||
the bit should be set or cleared in
|
||||
.Dv altflagp
|
||||
rather than
|
||||
.Dv flagp .
|
||||
.El
|
||||
.Pp
|
||||
Each of the user visible
|
||||
.Dv MNT_
|
||||
flags has a corresponding
|
||||
.Dv MOPT_
|
||||
macro which defines an appropriate
|
||||
.Li "struct mntopt"
|
||||
entry.
|
||||
To simplify the program interface and ensure consistency across all
|
||||
programs, a general purpose macro,
|
||||
.Dv MOPT_STDOPTS ,
|
||||
is defined which
|
||||
contains an entry for all the generic VFS options.
|
||||
In addition, the macros
|
||||
.Dv MOPT_FORCE
|
||||
and
|
||||
.Dv MOPT_UPDATE
|
||||
exist to enable the
|
||||
.Dv MNT_FORCE
|
||||
and
|
||||
.Dv MNT_UPDATE
|
||||
flags to be set.
|
||||
Finally, the table must be terminated by an entry with a NULL
|
||||
first element.
|
||||
.Sh EXAMPLES
|
||||
Most commands will use the standard option set.
|
||||
Local filesystems which support the
|
||||
.Dv MNT_UPDATE
|
||||
flag, would also have an
|
||||
.Dv MOPT_UPDATE
|
||||
entry.
|
||||
This can be declared and used as follows:
|
||||
.Bd -literal
|
||||
#include "mntopts.h"
|
||||
|
||||
struct mntopt mopts[] = {
|
||||
MOPT_STDOPTS,
|
||||
MOPT_UPDATE,
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
...
|
||||
mntflags = mntaltflags = 0;
|
||||
...
|
||||
getmntopts(options, mopts, &mntflags, &mntaltflags);
|
||||
...
|
||||
.Ed
|
||||
.Sh DIAGNOSTICS
|
||||
If the external integer variable
|
||||
.Dv getmnt_silent
|
||||
is non-zero then the
|
||||
.Nm getmntopts
|
||||
function displays an error message and exits if an
|
||||
unrecognized option is encountered.
|
||||
By default
|
||||
.Dv getmnt_silent
|
||||
is zero.
|
||||
.Sh SEE ALSO
|
||||
.Xr err 3 ,
|
||||
.Xr mount 8
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Fn getmntopts
|
||||
function appeared in
|
||||
.Bx 4.4 .
|
101
sbin/mount/getmntopts.c
Normal file
101
sbin/mount/getmntopts.c
Normal file
@ -0,0 +1,101 @@
|
||||
/*-
|
||||
* Copyright (c) 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.
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)getmntopts.c 8.3 (Berkeley) 3/29/95";
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/mount.h>
|
||||
|
||||
#include <err.h>
|
||||
#include <errno.h>
|
||||
#include <fstab.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "mntopts.h"
|
||||
|
||||
int getmnt_silent = 0;
|
||||
|
||||
void
|
||||
getmntopts(options, m0, flagp, altflagp)
|
||||
const char *options;
|
||||
const struct mntopt *m0;
|
||||
int *flagp;
|
||||
int *altflagp;
|
||||
{
|
||||
const struct mntopt *m;
|
||||
int negative;
|
||||
char *opt, *optbuf, *p;
|
||||
int *thisflagp;
|
||||
|
||||
/* Copy option string, since it is about to be torn asunder... */
|
||||
if ((optbuf = strdup(options)) == NULL)
|
||||
err(1, NULL);
|
||||
|
||||
for (opt = optbuf; (opt = strtok(opt, ",")) != NULL; opt = NULL) {
|
||||
/* Check for "no" prefix. */
|
||||
if (opt[0] == 'n' && opt[1] == 'o') {
|
||||
negative = 1;
|
||||
opt += 2;
|
||||
} else
|
||||
negative = 0;
|
||||
|
||||
/*
|
||||
* for options with assignments in them (ie. quotas)
|
||||
* ignore the assignment as it's handled elsewhere
|
||||
*/
|
||||
p = strchr(opt, '=');
|
||||
if (p)
|
||||
*p = '\0';
|
||||
|
||||
/* Scan option table. */
|
||||
for (m = m0; m->m_option != NULL; ++m)
|
||||
if (strcasecmp(opt, m->m_option) == 0)
|
||||
break;
|
||||
|
||||
/* Save flag, or fail if option is not recognised. */
|
||||
if (m->m_option) {
|
||||
thisflagp = m->m_altloc ? altflagp : flagp;
|
||||
if (negative == m->m_inverse)
|
||||
*thisflagp |= m->m_flag;
|
||||
else
|
||||
*thisflagp &= ~m->m_flag;
|
||||
} else if (!getmnt_silent) {
|
||||
errx(1, "-o %s: option not supported", opt);
|
||||
}
|
||||
}
|
||||
|
||||
free(optbuf);
|
||||
}
|
80
sbin/mount/mntopts.h
Normal file
80
sbin/mount/mntopts.h
Normal file
@ -0,0 +1,80 @@
|
||||
/*-
|
||||
* Copyright (c) 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.
|
||||
*
|
||||
* @(#)mntopts.h 8.7 (Berkeley) 3/29/95
|
||||
*/
|
||||
|
||||
struct mntopt {
|
||||
const char *m_option; /* option name */
|
||||
int m_inverse; /* if a negative option, eg "dev" */
|
||||
int m_flag; /* bit to set, eg. MNT_RDONLY */
|
||||
int m_altloc; /* 1 => set bit in altflags */
|
||||
};
|
||||
|
||||
/* User-visible MNT_ flags. */
|
||||
#define MOPT_ASYNC { "async", 0, MNT_ASYNC, 0 }
|
||||
#define MOPT_NODEV { "dev", 1, MNT_NODEV, 0 }
|
||||
#define MOPT_NOEXEC { "exec", 1, MNT_NOEXEC, 0 }
|
||||
#define MOPT_NOSUID { "suid", 1, MNT_NOSUID, 0 }
|
||||
#define MOPT_RDONLY { "rdonly", 0, MNT_RDONLY, 0 }
|
||||
#define MOPT_SYNC { "sync", 0, MNT_SYNCHRONOUS, 0 }
|
||||
#define MOPT_UNION { "union", 0, MNT_UNION, 0 }
|
||||
#define MOPT_USERQUOTA { "userquota", 0, 0, 0 }
|
||||
#define MOPT_GROUPQUOTA { "groupquota", 0, 0, 0 }
|
||||
|
||||
/* Control flags. */
|
||||
#define MOPT_FORCE { "force", 0, MNT_FORCE, 0 }
|
||||
#define MOPT_UPDATE { "update", 0, MNT_UPDATE, 0 }
|
||||
#define MOPT_RO { "ro", 0, MNT_RDONLY, 0 }
|
||||
#define MOPT_RW { "rw", 1, MNT_RDONLY, 0 }
|
||||
|
||||
/* This is parsed by mount(8), but is ignored by specific mount_*(8)s. */
|
||||
#define MOPT_AUTO { "auto", 0, 0, 0 }
|
||||
|
||||
#define MOPT_FSTAB_COMPAT \
|
||||
MOPT_RO, \
|
||||
MOPT_RW, \
|
||||
MOPT_AUTO
|
||||
|
||||
/* Standard options which all mounts can understand. */
|
||||
#define MOPT_STDOPTS \
|
||||
MOPT_USERQUOTA, \
|
||||
MOPT_GROUPQUOTA, \
|
||||
MOPT_FSTAB_COMPAT, \
|
||||
MOPT_NODEV, \
|
||||
MOPT_NOEXEC, \
|
||||
MOPT_NOSUID, \
|
||||
MOPT_RDONLY, \
|
||||
MOPT_UNION
|
||||
|
||||
void getmntopts __P((const char *, const struct mntopt *, int *, int *));
|
||||
extern int getmnt_silent;
|
275
sbin/mount/mount.8
Normal file
275
sbin/mount/mount.8
Normal file
@ -0,0 +1,275 @@
|
||||
.\" Copyright (c) 1980, 1989, 1991, 1993
|
||||
.\" 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.
|
||||
.\"
|
||||
.\" @(#)mount.8 8.8 (Berkeley) 6/16/94
|
||||
.\"
|
||||
.Dd June 16, 1994
|
||||
.Dt MOUNT 8
|
||||
.Os BSD 4
|
||||
.Sh NAME
|
||||
.Nm mount
|
||||
.Nd mount file systems
|
||||
.Sh SYNOPSIS
|
||||
.Nm mount
|
||||
.Op Fl adfruvw
|
||||
.Op Fl t Ar ufs | lfs | external_type
|
||||
.Nm mount
|
||||
.Op Fl dfruvw
|
||||
.Ar special | node
|
||||
.Nm mount
|
||||
.Op Fl dfruvw
|
||||
.Op Fl o Ar options
|
||||
.Op Fl t Ar ufs | lfs | external_type
|
||||
.Ar special node
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm mount
|
||||
command
|
||||
calls the
|
||||
.Xr mount 2
|
||||
system call to prepare and graft a
|
||||
.Ar "special device"
|
||||
or the remote node (rhost:path) on to the file system tree at the point
|
||||
.Ar node .
|
||||
If either
|
||||
.Ar special
|
||||
or
|
||||
.Ar node
|
||||
are not provided, the appropriate information is taken from the
|
||||
.Xr fstab 5
|
||||
file.
|
||||
.Pp
|
||||
The system maintains a list of currently mounted file systems.
|
||||
If no arguments are given to
|
||||
.Nm mount,
|
||||
this list is printed.
|
||||
.Pp
|
||||
The options are as follows:
|
||||
.Bl -tag -width indent
|
||||
.It Fl a
|
||||
All the filesystems described in
|
||||
.Xr fstab 5
|
||||
are mounted.
|
||||
Exceptions are those marked as ``noauto'' or are excluded by the
|
||||
.Fl t
|
||||
flag (see below).
|
||||
.It Fl d
|
||||
Causes everything to be done except for the actual system call.
|
||||
This option is useful in conjunction with the
|
||||
.Fl v
|
||||
flag to
|
||||
determine what the
|
||||
.Nm mount
|
||||
command is trying to do.
|
||||
.It Fl f
|
||||
Forces the revocation of write access when trying to downgrade
|
||||
a filesystem mount status from read-write to read-only.
|
||||
.It Fl o
|
||||
Options are specified with a
|
||||
.Fl o
|
||||
flag followed by a comma separated string of options.
|
||||
The following options are available:
|
||||
.Bl -tag -width indent
|
||||
.It async
|
||||
All
|
||||
.Tn I/O
|
||||
to the file system should be done asynchronously.
|
||||
This is a
|
||||
.Em dangerous
|
||||
flag to set,
|
||||
and should not be used unless you are prepared to recreate the file
|
||||
system should your system crash.
|
||||
.It force
|
||||
The same as
|
||||
.Fl f ;
|
||||
forces the revocation of write access when trying to downgrade
|
||||
a filesystem mount status from read-write to read-only.
|
||||
.It noauto
|
||||
This filesystem should be skipped when mount is run with the
|
||||
.Fl a
|
||||
flag.
|
||||
.It nodev
|
||||
Do not interpret character or block special devices on the file system.
|
||||
This option is useful for a server that has file systems containing
|
||||
special devices for architectures other than its own.
|
||||
.It noexec
|
||||
Do not allow execution of any binaries on the mounted file system.
|
||||
This option is useful for a server that has file systems containing
|
||||
binaries for architectures other than its own.
|
||||
.It nosuid
|
||||
Do not allow set-user-identifier or set-group-identifier bits to take effect.
|
||||
.It rdonly
|
||||
The same as
|
||||
.Fl r ;
|
||||
mount the file system read-only (even the super-user may not write it).
|
||||
.It sync
|
||||
All
|
||||
.Tn I/O
|
||||
to the file system should be done synchronously.
|
||||
.It update
|
||||
The same as
|
||||
.Fl u ;
|
||||
indicate that the status of an already mounted file system should be changed.
|
||||
.It union
|
||||
Causes the namespace at the mount point to appear as the union
|
||||
of the mounted filesystem root and the existing directory.
|
||||
Lookups will be done in the mounted filesystem first.
|
||||
If those operations fail due to a non-existent file the underlying
|
||||
directory is then accessed.
|
||||
All creates are done in the mounted filesystem.
|
||||
.El
|
||||
.Pp
|
||||
Any additional options specific to a filesystem type that is not
|
||||
one of the internally known types (see the
|
||||
.Fl t
|
||||
option) may be passed as a comma separated list; these options are
|
||||
distinguished by a leading
|
||||
.Dq \&-
|
||||
(dash).
|
||||
Options that take a value are specified using the syntax -option=value.
|
||||
For example, the mount command:
|
||||
.Bd -literal -offset indent
|
||||
mount -t mfs -o nosuid,-N,-s=4000 /dev/dk0b /tmp
|
||||
.Ed
|
||||
.Pp
|
||||
causes
|
||||
.Nm mount
|
||||
to execute the equivalent of:
|
||||
.Bd -literal -offset indent
|
||||
/sbin/mount_mfs -o nosuid -N -s 4000 /dev/dk0b /tmp
|
||||
.Ed
|
||||
.It Fl r
|
||||
The file system is to be mounted read-only.
|
||||
Mount the file system read-only (even the super-user may not write it).
|
||||
The same as the
|
||||
.Dq rdonly
|
||||
argument to the
|
||||
.Fl o
|
||||
option.
|
||||
.It Fl t Ar "ufs \\*(Ba lfs \\*(Ba external type"
|
||||
The argument following the
|
||||
.Fl t
|
||||
is used to indicate the file system type.
|
||||
The type
|
||||
.Ar ufs
|
||||
is the default.
|
||||
The \fI-t\fP option can be used
|
||||
to indicate that the actions should only be taken on
|
||||
filesystems of the specified type.
|
||||
More than one type may be specified in a comma separated list.
|
||||
The list of filesystem types can be prefixed with
|
||||
.Dq no
|
||||
to specify the filesystem types for which action should
|
||||
.Em not
|
||||
be taken.
|
||||
For example, the
|
||||
.Nm mount
|
||||
command:
|
||||
.Bd -literal -offset indent
|
||||
mount -a -t nonfs,mfs
|
||||
.Ed
|
||||
.Pp
|
||||
mounts all filesystems except those of type
|
||||
.Tn NFS
|
||||
and
|
||||
.Tn MFS .
|
||||
.Pp
|
||||
If the type is not one of the internally known types,
|
||||
mount will attempt to execute a program in
|
||||
.Pa /sbin/mount_ Ns Em XXX
|
||||
where
|
||||
.Em XXX
|
||||
is replaced by the type name.
|
||||
For example, nfs filesystems are mounted by the program
|
||||
.Pa /sbin/mount_nfs .
|
||||
.It Fl u
|
||||
The
|
||||
.Fl u
|
||||
flag indicates that the status of an already mounted file
|
||||
system should be changed.
|
||||
Any of the options discussed above (the
|
||||
.Fl o
|
||||
option)
|
||||
may be changed;
|
||||
also a file system can be changed from read-only to read-write
|
||||
or vice versa.
|
||||
An attempt to change from read-write to read-only will fail if any
|
||||
files on the filesystem are currently open for writing unless the
|
||||
.Fl f
|
||||
flag is also specified.
|
||||
The set of options is determined by first extracting the options
|
||||
for the file system from the
|
||||
.Xr fstab
|
||||
table,
|
||||
then applying any options specified by the
|
||||
.Fl o
|
||||
argument,
|
||||
and finally applying the
|
||||
.Fl r
|
||||
or
|
||||
.Fl w
|
||||
option.
|
||||
.It Fl v
|
||||
Verbose mode.
|
||||
.It Fl w
|
||||
The file system object is to be read and write.
|
||||
.Pp
|
||||
The options specific to NFS filesystems are described in the
|
||||
.Xr mount_nfs 8
|
||||
manual page.
|
||||
.Sh FILES
|
||||
.Bl -tag -width /etc/fstab -compact
|
||||
.It Pa /etc/fstab
|
||||
file system table
|
||||
.El
|
||||
.Sh SEE ALSO
|
||||
.Xr mount 2 ,
|
||||
.Xr fstab 5 ,
|
||||
.Xr mount_cd9660 8 ,
|
||||
.Xr mount_fdesc 8 ,
|
||||
.Xr mount_kernfs 8 ,
|
||||
.Xr mount_lfs 8 ,
|
||||
.Xr mount_lofs 8 ,
|
||||
.Xr mount_mfs 8 ,
|
||||
.Xr mount_nfs 8 ,
|
||||
.Xr mount_null 8 ,
|
||||
.Xr mount_portal 8 ,
|
||||
.Xr mount_procfs 8 ,
|
||||
.Xr mount_umap 8 ,
|
||||
.Xr mount_union 8 ,
|
||||
.Xr umount 8
|
||||
.Sh BUGS
|
||||
It is possible for a corrupted file system to cause a crash.
|
||||
.Sh HISTORY
|
||||
A
|
||||
.Nm mount
|
||||
command appeared in
|
||||
.At v6 .
|
486
sbin/mount/mount.c
Normal file
486
sbin/mount/mount.c
Normal file
@ -0,0 +1,486 @@
|
||||
/*
|
||||
* Copyright (c) 1980, 1989, 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.
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char copyright[] =
|
||||
"@(#) Copyright (c) 1980, 1989, 1993, 1994\n\
|
||||
The Regents of the University of California. All rights reserved.\n";
|
||||
#endif /* not lint */
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)mount.c 8.25 (Berkeley) 5/8/95";
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/mount.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
#include <err.h>
|
||||
#include <errno.h>
|
||||
#include <fstab.h>
|
||||
#include <pwd.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "pathnames.h"
|
||||
|
||||
int debug, verbose;
|
||||
|
||||
int checkvfsname __P((const char *, const char **));
|
||||
char *catopt __P((char *, const char *));
|
||||
struct statfs
|
||||
*getmntpt __P((const char *));
|
||||
int hasopt __P((const char *, const char *));
|
||||
const char
|
||||
**makevfslist __P((char *));
|
||||
void mangle __P((char *, int *, const char **));
|
||||
int mountfs __P((const char *, const char *, const char *,
|
||||
int, const char *, const char *));
|
||||
void prmount __P((struct statfs *));
|
||||
void usage __P((void));
|
||||
|
||||
/* From mount_ufs.c. */
|
||||
int mount_ufs __P((int, char * const *));
|
||||
|
||||
/* Map from mount otions to printable formats. */
|
||||
static struct opt {
|
||||
int o_opt;
|
||||
const char *o_name;
|
||||
} optnames[] = {
|
||||
{ MNT_ASYNC, "asynchronous" },
|
||||
{ MNT_EXPORTED, "NFS exported" },
|
||||
{ MNT_LOCAL, "local" },
|
||||
{ MNT_NODEV, "nodev" },
|
||||
{ MNT_NOEXEC, "noexec" },
|
||||
{ MNT_NOSUID, "nosuid" },
|
||||
{ MNT_QUOTA, "with quotas" },
|
||||
{ MNT_RDONLY, "read-only" },
|
||||
{ MNT_SYNCHRONOUS, "synchronous" },
|
||||
{ MNT_UNION, "union" },
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
int
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char * const argv[];
|
||||
{
|
||||
const char *mntfromname, **vfslist, *vfstype;
|
||||
struct fstab *fs;
|
||||
struct statfs *mntbuf;
|
||||
FILE *mountdfp;
|
||||
pid_t pid;
|
||||
int all, ch, i, init_flags, mntsize, rval;
|
||||
char *options;
|
||||
|
||||
all = init_flags = 0;
|
||||
options = NULL;
|
||||
vfslist = NULL;
|
||||
vfstype = "ufs";
|
||||
while ((ch = getopt(argc, argv, "adfo:rwt:uv")) != EOF)
|
||||
switch (ch) {
|
||||
case 'a':
|
||||
all = 1;
|
||||
break;
|
||||
case 'd':
|
||||
debug = 1;
|
||||
break;
|
||||
case 'f':
|
||||
init_flags |= MNT_FORCE;
|
||||
break;
|
||||
case 'o':
|
||||
if (*optarg)
|
||||
options = catopt(options, optarg);
|
||||
break;
|
||||
case 'r':
|
||||
init_flags |= MNT_RDONLY;
|
||||
break;
|
||||
case 't':
|
||||
if (vfslist != NULL)
|
||||
errx(1, "only one -t option may be specified.");
|
||||
vfslist = makevfslist(optarg);
|
||||
vfstype = optarg;
|
||||
break;
|
||||
case 'u':
|
||||
init_flags |= MNT_UPDATE;
|
||||
break;
|
||||
case 'v':
|
||||
verbose = 1;
|
||||
break;
|
||||
case 'w':
|
||||
init_flags &= ~MNT_RDONLY;
|
||||
break;
|
||||
case '?':
|
||||
default:
|
||||
usage();
|
||||
/* NOTREACHED */
|
||||
}
|
||||
argc -= optind;
|
||||
argv += optind;
|
||||
|
||||
#define BADTYPE(type) \
|
||||
(strcmp(type, FSTAB_RO) && \
|
||||
strcmp(type, FSTAB_RW) && strcmp(type, FSTAB_RQ))
|
||||
|
||||
rval = 0;
|
||||
switch (argc) {
|
||||
case 0:
|
||||
if (all)
|
||||
while ((fs = getfsent()) != NULL) {
|
||||
if (BADTYPE(fs->fs_type))
|
||||
continue;
|
||||
if (checkvfsname(fs->fs_vfstype, vfslist))
|
||||
continue;
|
||||
if (hasopt(fs->fs_mntops, "noauto"))
|
||||
continue;
|
||||
if (mountfs(fs->fs_vfstype, fs->fs_spec,
|
||||
fs->fs_file, init_flags, options,
|
||||
fs->fs_mntops))
|
||||
rval = 1;
|
||||
}
|
||||
else {
|
||||
if ((mntsize = getmntinfo(&mntbuf, MNT_NOWAIT)) == 0)
|
||||
err(1, "getmntinfo");
|
||||
for (i = 0; i < mntsize; i++) {
|
||||
if (checkvfsname(mntbuf[i].f_fstypename, vfslist))
|
||||
continue;
|
||||
prmount(&mntbuf[i]);
|
||||
}
|
||||
}
|
||||
exit(rval);
|
||||
case 1:
|
||||
if (vfslist != NULL)
|
||||
usage();
|
||||
|
||||
if (init_flags & MNT_UPDATE) {
|
||||
if ((mntbuf = getmntpt(*argv)) == NULL)
|
||||
errx(1,
|
||||
"unknown special file or file system %s.",
|
||||
*argv);
|
||||
if ((fs = getfsfile(mntbuf->f_mntonname)) != NULL)
|
||||
mntfromname = fs->fs_spec;
|
||||
else
|
||||
mntfromname = mntbuf->f_mntfromname;
|
||||
rval = mountfs(mntbuf->f_fstypename, mntfromname,
|
||||
mntbuf->f_mntonname, init_flags, options, 0);
|
||||
break;
|
||||
}
|
||||
if ((fs = getfsfile(*argv)) == NULL &&
|
||||
(fs = getfsspec(*argv)) == NULL)
|
||||
errx(1, "%s: unknown special file or file system.",
|
||||
*argv);
|
||||
if (BADTYPE(fs->fs_type))
|
||||
errx(1, "%s has unknown file system type.",
|
||||
*argv);
|
||||
rval = mountfs(fs->fs_vfstype, fs->fs_spec, fs->fs_file,
|
||||
init_flags, options, fs->fs_mntops);
|
||||
break;
|
||||
case 2:
|
||||
/*
|
||||
* If -t flag has not been specified, and spec contains either
|
||||
* a ':' or a '@' then assume that an NFS filesystem is being
|
||||
* specified ala Sun.
|
||||
*/
|
||||
if (vfslist == NULL && strpbrk(argv[0], ":@") != NULL)
|
||||
vfstype = "nfs";
|
||||
rval = mountfs(vfstype,
|
||||
argv[0], argv[1], init_flags, options, NULL);
|
||||
break;
|
||||
default:
|
||||
usage();
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
/*
|
||||
* If the mount was successfully, and done by root, tell mountd the
|
||||
* good news. Pid checks are probably unnecessary, but don't hurt.
|
||||
*/
|
||||
if (rval == 0 && getuid() == 0 &&
|
||||
(mountdfp = fopen(_PATH_MOUNTDPID, "r")) != NULL) {
|
||||
if (fscanf(mountdfp, "%ld", &pid) == 1 &&
|
||||
pid > 0 && kill(pid, SIGHUP) == -1 && errno != ESRCH)
|
||||
err(1, "signal mountd");
|
||||
(void)fclose(mountdfp);
|
||||
}
|
||||
|
||||
exit(rval);
|
||||
}
|
||||
|
||||
int
|
||||
hasopt(mntopts, option)
|
||||
const char *mntopts, *option;
|
||||
{
|
||||
int negative, found;
|
||||
char *opt, *optbuf;
|
||||
|
||||
if (option[0] == 'n' && option[1] == 'o') {
|
||||
negative = 1;
|
||||
option += 2;
|
||||
} else
|
||||
negative = 0;
|
||||
optbuf = strdup(mntopts);
|
||||
found = 0;
|
||||
for (opt = optbuf; (opt = strtok(opt, ",")) != NULL; opt = NULL) {
|
||||
if (opt[0] == 'n' && opt[1] == 'o') {
|
||||
if (!strcasecmp(opt + 2, option))
|
||||
found = negative;
|
||||
} else if (!strcasecmp(opt, option))
|
||||
found = !negative;
|
||||
}
|
||||
free(optbuf);
|
||||
return (found);
|
||||
}
|
||||
|
||||
int
|
||||
mountfs(vfstype, spec, name, flags, options, mntopts)
|
||||
const char *vfstype, *spec, *name, *options, *mntopts;
|
||||
int flags;
|
||||
{
|
||||
/* List of directories containing mount_xxx subcommands. */
|
||||
static const char *edirs[] = {
|
||||
_PATH_SBIN,
|
||||
_PATH_USRSBIN,
|
||||
NULL
|
||||
};
|
||||
const char *argv[100], **edir;
|
||||
struct statfs sf;
|
||||
pid_t pid;
|
||||
int argc, i, status;
|
||||
char *optbuf, execname[MAXPATHLEN + 1], mntpath[MAXPATHLEN];
|
||||
|
||||
if (realpath(name, mntpath) == NULL) {
|
||||
warn("realpath %s", mntpath);
|
||||
return (1);
|
||||
}
|
||||
|
||||
name = mntpath;
|
||||
|
||||
if (mntopts == NULL)
|
||||
mntopts = "";
|
||||
if (options == NULL) {
|
||||
if (*mntopts == '\0') {
|
||||
options = "rw";
|
||||
} else {
|
||||
options = mntopts;
|
||||
mntopts = "";
|
||||
}
|
||||
}
|
||||
optbuf = catopt(strdup(mntopts), options);
|
||||
|
||||
if (strcmp(name, "/") == 0)
|
||||
flags |= MNT_UPDATE;
|
||||
if (flags & MNT_FORCE)
|
||||
optbuf = catopt(optbuf, "force");
|
||||
if (flags & MNT_RDONLY)
|
||||
optbuf = catopt(optbuf, "ro");
|
||||
/*
|
||||
* XXX
|
||||
* The mount_mfs (newfs) command uses -o to select the
|
||||
* optimisation mode. We don't pass the default "-o rw"
|
||||
* for that reason.
|
||||
*/
|
||||
if (flags & MNT_UPDATE)
|
||||
optbuf = catopt(optbuf, "update");
|
||||
|
||||
argc = 0;
|
||||
argv[argc++] = vfstype;
|
||||
mangle(optbuf, &argc, argv);
|
||||
argv[argc++] = spec;
|
||||
argv[argc++] = name;
|
||||
argv[argc] = NULL;
|
||||
|
||||
if (debug) {
|
||||
(void)printf("exec: mount_%s", vfstype);
|
||||
for (i = 1; i < argc; i++)
|
||||
(void)printf(" %s", argv[i]);
|
||||
(void)printf("\n");
|
||||
return (0);
|
||||
}
|
||||
|
||||
switch (pid = vfork()) {
|
||||
case -1: /* Error. */
|
||||
warn("vfork");
|
||||
free(optbuf);
|
||||
return (1);
|
||||
case 0: /* Child. */
|
||||
if (strcmp(vfstype, "ufs") == 0)
|
||||
exit(mount_ufs(argc, (char * const *) argv));
|
||||
|
||||
/* Go find an executable. */
|
||||
edir = edirs;
|
||||
do {
|
||||
(void)snprintf(execname,
|
||||
sizeof(execname), "%s/mount_%s", *edir, vfstype);
|
||||
execv(execname, (char * const *)argv);
|
||||
if (errno != ENOENT)
|
||||
warn("exec %s for %s", execname, name);
|
||||
} while (*++edir != NULL);
|
||||
|
||||
if (errno == ENOENT)
|
||||
warn("exec %s for %s", execname, name);
|
||||
exit(1);
|
||||
/* NOTREACHED */
|
||||
default: /* Parent. */
|
||||
free(optbuf);
|
||||
|
||||
if (waitpid(pid, &status, 0) < 0) {
|
||||
warn("waitpid");
|
||||
return (1);
|
||||
}
|
||||
|
||||
if (WIFEXITED(status)) {
|
||||
if (WEXITSTATUS(status) != 0)
|
||||
return (WEXITSTATUS(status));
|
||||
} else if (WIFSIGNALED(status)) {
|
||||
warnx("%s: %s", name, sys_siglist[WTERMSIG(status)]);
|
||||
return (1);
|
||||
}
|
||||
|
||||
if (verbose) {
|
||||
if (statfs(name, &sf) < 0) {
|
||||
warn("statfs %s", name);
|
||||
return (1);
|
||||
}
|
||||
prmount(&sf);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
void
|
||||
prmount(sfp)
|
||||
struct statfs *sfp;
|
||||
{
|
||||
int flags;
|
||||
struct opt *o;
|
||||
struct passwd *pw;
|
||||
int f;
|
||||
|
||||
(void)printf("%s on %s", sfp->f_mntfromname, sfp->f_mntonname);
|
||||
|
||||
flags = sfp->f_flags & MNT_VISFLAGMASK;
|
||||
for (f = 0, o = optnames; flags && o->o_opt; o++)
|
||||
if (flags & o->o_opt) {
|
||||
(void)printf("%s%s", !f++ ? " (" : ", ", o->o_name);
|
||||
flags &= ~o->o_opt;
|
||||
}
|
||||
if (sfp->f_owner) {
|
||||
(void)printf("%smounted by ", !f++ ? " (" : ", ");
|
||||
if ((pw = getpwuid(sfp->f_owner)) != NULL)
|
||||
(void)printf("%s", pw->pw_name);
|
||||
else
|
||||
(void)printf("%d", sfp->f_owner);
|
||||
}
|
||||
(void)printf(f ? ")\n" : "\n");
|
||||
}
|
||||
|
||||
struct statfs *
|
||||
getmntpt(name)
|
||||
const char *name;
|
||||
{
|
||||
struct statfs *mntbuf;
|
||||
int i, mntsize;
|
||||
|
||||
mntsize = getmntinfo(&mntbuf, MNT_NOWAIT);
|
||||
for (i = 0; i < mntsize; i++)
|
||||
if (strcmp(mntbuf[i].f_mntfromname, name) == 0 ||
|
||||
strcmp(mntbuf[i].f_mntonname, name) == 0)
|
||||
return (&mntbuf[i]);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
char *
|
||||
catopt(s0, s1)
|
||||
char *s0;
|
||||
const char *s1;
|
||||
{
|
||||
size_t i;
|
||||
char *cp;
|
||||
|
||||
if (s0 && *s0) {
|
||||
i = strlen(s0) + strlen(s1) + 1 + 1;
|
||||
if ((cp = malloc(i)) == NULL)
|
||||
err(1, NULL);
|
||||
(void)snprintf(cp, i, "%s,%s", s0, s1);
|
||||
} else
|
||||
cp = strdup(s1);
|
||||
|
||||
if (s0)
|
||||
free(s0);
|
||||
return (cp);
|
||||
}
|
||||
|
||||
void
|
||||
mangle(options, argcp, argv)
|
||||
char *options;
|
||||
int *argcp;
|
||||
const char **argv;
|
||||
{
|
||||
char *p, *s;
|
||||
int argc;
|
||||
|
||||
argc = *argcp;
|
||||
for (s = options; (p = strsep(&s, ",")) != NULL;)
|
||||
if (*p != '\0')
|
||||
if (*p == '-') {
|
||||
argv[argc++] = p;
|
||||
p = strchr(p, '=');
|
||||
if (p) {
|
||||
*p = '\0';
|
||||
argv[argc++] = p+1;
|
||||
}
|
||||
} else if (strcmp(p, "rw") != 0) {
|
||||
argv[argc++] = "-o";
|
||||
argv[argc++] = p;
|
||||
}
|
||||
|
||||
*argcp = argc;
|
||||
}
|
||||
|
||||
void
|
||||
usage()
|
||||
{
|
||||
|
||||
(void)fprintf(stderr,
|
||||
"usage: mount %s %s\n mount %s\n mount %s\n",
|
||||
"[-dfruvw] [-o options] [-t ufs | external_type]",
|
||||
"special node",
|
||||
"[-adfruvw] [-t ufs | external_type]",
|
||||
"[-dfruvw] special | node");
|
||||
exit(1);
|
||||
}
|
134
sbin/mount/mount_ufs.c
Normal file
134
sbin/mount/mount_ufs.c
Normal file
@ -0,0 +1,134 @@
|
||||
/*-
|
||||
* Copyright (c) 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.
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char copyright[] =
|
||||
"@(#) Copyright (c) 1993, 1994\n\
|
||||
The Regents of the University of California. All rights reserved.\n";
|
||||
#endif /* not lint */
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)mount_ufs.c 8.4 (Berkeley) 4/26/95";
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/mount.h>
|
||||
|
||||
#include <err.h>
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <ufs/ufs/ufsmount.h>
|
||||
|
||||
#include "mntopts.h"
|
||||
|
||||
void ufs_usage __P((void));
|
||||
|
||||
static struct mntopt mopts[] = {
|
||||
MOPT_STDOPTS,
|
||||
MOPT_ASYNC,
|
||||
MOPT_SYNC,
|
||||
MOPT_UPDATE,
|
||||
MOPT_FORCE,
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
int
|
||||
mount_ufs(argc, argv)
|
||||
int argc;
|
||||
char * const argv[];
|
||||
{
|
||||
extern int optreset;
|
||||
struct ufs_args args;
|
||||
int ch, mntflags;
|
||||
char *fs_name;
|
||||
|
||||
mntflags = 0;
|
||||
optind = optreset = 1; /* Reset for parse of new argv. */
|
||||
while ((ch = getopt(argc, argv, "o:")) != EOF)
|
||||
switch (ch) {
|
||||
case 'o':
|
||||
getmntopts(optarg, mopts, &mntflags, 0);
|
||||
break;
|
||||
case '?':
|
||||
default:
|
||||
ufs_usage();
|
||||
}
|
||||
argc -= optind;
|
||||
argv += optind;
|
||||
|
||||
if (argc != 2)
|
||||
ufs_usage();
|
||||
|
||||
args.fspec = argv[0]; /* The name of the device file. */
|
||||
fs_name = argv[1]; /* The mount point. */
|
||||
|
||||
#define DEFAULT_ROOTUID -2
|
||||
args.export.ex_root = DEFAULT_ROOTUID;
|
||||
if (mntflags & MNT_RDONLY)
|
||||
args.export.ex_flags = MNT_EXRDONLY;
|
||||
else
|
||||
args.export.ex_flags = 0;
|
||||
|
||||
if (mount("ufs", fs_name, mntflags, &args) < 0) {
|
||||
(void)fprintf(stderr, "%s on %s: ", args.fspec, fs_name);
|
||||
switch (errno) {
|
||||
case EMFILE:
|
||||
(void)fprintf(stderr, "mount table full.\n");
|
||||
break;
|
||||
case EINVAL:
|
||||
if (mntflags & MNT_UPDATE)
|
||||
(void)fprintf(stderr,
|
||||
"Specified device does not match mounted device.\n");
|
||||
else
|
||||
(void)fprintf(stderr,
|
||||
"Incorrect super block.\n");
|
||||
break;
|
||||
default:
|
||||
(void)fprintf(stderr, "%s\n", strerror(errno));
|
||||
break;
|
||||
}
|
||||
return (1);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
void
|
||||
ufs_usage()
|
||||
{
|
||||
(void)fprintf(stderr, "usage: mount_ufs [-o options] special node\n");
|
||||
exit(1);
|
||||
}
|
92
sbin/mount/vfslist.c
Normal file
92
sbin/mount/vfslist.c
Normal file
@ -0,0 +1,92 @@
|
||||
/*
|
||||
* Copyright (c) 1995
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)vfslist.c 8.1 (Berkeley) 5/8/95";
|
||||
#endif /* not lint */
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
int checkvfsname __P((const char *, const char **));
|
||||
const char **makevfslist __P((char *));
|
||||
static int skipvfs;
|
||||
|
||||
int
|
||||
checkvfsname(vfsname, vfslist)
|
||||
const char *vfsname;
|
||||
const char **vfslist;
|
||||
{
|
||||
|
||||
if (vfslist == NULL)
|
||||
return (0);
|
||||
while (*vfslist != NULL) {
|
||||
if (strcmp(vfsname, *vfslist) == 0)
|
||||
return (skipvfs);
|
||||
++vfslist;
|
||||
}
|
||||
return (!skipvfs);
|
||||
}
|
||||
|
||||
const char **
|
||||
makevfslist(fslist)
|
||||
char *fslist;
|
||||
{
|
||||
const char **av;
|
||||
int i;
|
||||
char *nextcp;
|
||||
|
||||
if (fslist == NULL)
|
||||
return (NULL);
|
||||
if (fslist[0] == 'n' && fslist[1] == 'o') {
|
||||
fslist += 2;
|
||||
skipvfs = 1;
|
||||
}
|
||||
for (i = 0, nextcp = fslist; *nextcp; nextcp++)
|
||||
if (*nextcp == ',')
|
||||
i++;
|
||||
if ((av = malloc((size_t)(i + 2) * sizeof(char *))) == NULL) {
|
||||
warn(NULL);
|
||||
return (NULL);
|
||||
}
|
||||
nextcp = fslist;
|
||||
i = 0;
|
||||
av[i++] = nextcp;
|
||||
while ((nextcp = strchr(nextcp, ',')) != NULL) {
|
||||
*nextcp++ = '\0';
|
||||
av[i++] = nextcp;
|
||||
}
|
||||
av[i++] = NULL;
|
||||
return (av);
|
||||
}
|
Loading…
Reference in New Issue
Block a user