Add a --mount command to fstabinfo so it can mount specific mount points, as mount can get confused with binded mounts, bug #36.
This commit is contained in:
parent
0fa512c2b5
commit
52a3cc162b
@ -22,10 +22,12 @@ mount_svcdir()
|
||||
cp -p "${RC_SVCDIR}"/deptree "${RC_SVCDIR}"/depconfig \
|
||||
"${RC_SVCDIR}"/nettree "${RC_LIBDIR}"/tmp 2>/dev/null
|
||||
fi
|
||||
if ! mount -t tmpfs -o rw,noexec,nosuid none "${RC_SVCDIR}" 2>/dev/null; then
|
||||
mdconfig -a -t malloc -s "${rc_svcsize:-1024}"k -u 0
|
||||
newfs -b 4096 -i 1024 -n /dev/md0
|
||||
mount -o rw,noexec,nosuid /dev/md0 "${RC_SVCDIR}"
|
||||
if ! fstabinfo --mount "${RC_SVCDIR}"; then
|
||||
if ! mount -t tmpfs -o rw,noexec,nosuid none "${RC_SVCDIR}" 2>/dev/null; then
|
||||
mdconfig -a -t malloc -s "${rc_svcsize:-1024}"k -u 0
|
||||
newfs -b 4096 -i 1024 -n /dev/md0
|
||||
mount -o rw,noexec,nosuid /dev/md0 "${RC_SVCDIR}"
|
||||
fi
|
||||
fi
|
||||
retval=$?
|
||||
if ${dotmp}; then
|
||||
|
@ -44,9 +44,7 @@ mount_svcdir()
|
||||
fi
|
||||
|
||||
# If we have no entry in fstab for $RC_SVCDIR, provide our own
|
||||
if fstabinfo --quiet "${RC_SVCDIR}"; then
|
||||
mount -n "${RC_SVCDIR}"
|
||||
else
|
||||
if ! fstabinfo --mount "${RC_SVCDIR}"; then
|
||||
mount -n -t "${fs}" ${fsopts} "${devdir}" "${RC_SVCDIR}"
|
||||
fi
|
||||
|
||||
@ -91,9 +89,7 @@ if ${mountproc}; then
|
||||
procfs="proc"
|
||||
[ "${RC_UNAME}" = "GNU/kFreeBSD" ] && proc="linprocfs"
|
||||
ebegin "Mounting ${procfs} at /proc"
|
||||
if fstabinfo --quiet /proc; then
|
||||
mount -n /proc
|
||||
else
|
||||
if ! fstabinfo --mount /proc; then
|
||||
mount -n -t "${procfs}" -o noexec,nosuid,nodev proc /proc
|
||||
fi
|
||||
eend $?
|
||||
@ -116,9 +112,7 @@ then
|
||||
if [ -d /sys ]; then
|
||||
if ! mountinfo --quiet /sys; then
|
||||
ebegin "Mounting sysfs at /sys"
|
||||
if fstabinfo --quiet /sys; then
|
||||
mount -n /sys
|
||||
else
|
||||
if ! fstabinfo --mount /sys; then
|
||||
mount -n -t sysfs -o noexec,nosuid,nodev sysfs /sys
|
||||
fi
|
||||
eend $?
|
||||
@ -173,9 +167,7 @@ do
|
||||
|
||||
if [ -d "$2" ]; then
|
||||
ebegin "Mounting $1 at $2"
|
||||
if fstabinfo --quiet "$2"; then
|
||||
mount -n "$2"
|
||||
else
|
||||
if ! fstabinfo --mount "$2"; then
|
||||
mount -n -t "$1" -o noexec,nosuid"$4" "$5" "$2"
|
||||
fi
|
||||
eend $?
|
||||
|
@ -31,6 +31,7 @@ ALL_LINKS= ${BINLINKS} ${SBINLINKS} ${RC_BINLINKS} ${RC_SBINLINKS}
|
||||
CLEANFILES+= ${ALL_LINKS}
|
||||
|
||||
LDFLAGS+= -L../librc -L../libeinfo
|
||||
LDFLAGS+= -Wl,--rpath=../librc -Wl,--rpath=../libeinfo
|
||||
LDADD+= -lutil -lrc -leinfo
|
||||
|
||||
MK= ../../mk
|
||||
|
@ -29,11 +29,13 @@
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/wait.h>
|
||||
#include <errno.h>
|
||||
#include <getopt.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/* Yay for linux and it's non liking of POSIX functions.
|
||||
Okay, we could use getfsent but the man page says use getmntent instead
|
||||
@ -41,6 +43,7 @@
|
||||
#ifdef __linux__
|
||||
#define HAVE_GETMNTENT
|
||||
#include <mntent.h>
|
||||
#define ENT mntent
|
||||
#define START_ENT fp = setmntent ("/etc/fstab", "r");
|
||||
#define GET_ENT getmntent (fp)
|
||||
#define GET_ENT_FILE(_name) getmntfile (_name)
|
||||
@ -53,6 +56,7 @@
|
||||
#else
|
||||
#define HAVE_GETFSENT
|
||||
#include <fstab.h>
|
||||
#define ENT fstab
|
||||
#define START_ENT
|
||||
#define GET_ENT getfsent ()
|
||||
#define GET_ENT_FILE(_name) getfsfile (_name)
|
||||
@ -88,10 +92,47 @@ static struct mntent *getmntfile (const char *file)
|
||||
|
||||
extern const char *applet;
|
||||
|
||||
static int do_mount (struct ENT *ent)
|
||||
{
|
||||
char *argv[8];
|
||||
pid_t pid;
|
||||
int status;
|
||||
|
||||
argv[0] = (char *) "/sbin/mount";
|
||||
argv[1] = (char *) "-o";
|
||||
argv[2] = ENT_OPTS (*ent);
|
||||
argv[3] = (char *) "-t";
|
||||
argv[4] = ENT_TYPE (*ent);
|
||||
argv[5] = ENT_BLOCKDEVICE (*ent);
|
||||
argv[6] = ENT_FILE (*ent);
|
||||
argv[7] = NULL;
|
||||
switch (pid = vfork()) {
|
||||
case -1:
|
||||
eerrorx ("%s: vfork: %s", applet,
|
||||
strerror (errno));
|
||||
/* NOTREACHED */
|
||||
case 0:
|
||||
execv (argv[0], argv);
|
||||
eerror ("%s: execv: %s", applet,
|
||||
strerror (errno));
|
||||
_exit(EXIT_FAILURE);
|
||||
/* NOTREACHED */
|
||||
default:
|
||||
waitpid (pid, &status, 0);
|
||||
if (WIFEXITED (status))
|
||||
return (WEXITSTATUS(status));
|
||||
else
|
||||
return (-1);
|
||||
/* NOTREACHED */
|
||||
}
|
||||
}
|
||||
|
||||
#include "_usage.h"
|
||||
#define getoptstring "bmop:t:" getoptstring_COMMON
|
||||
#define getoptstring "Mbmop:t:" getoptstring_COMMON
|
||||
static const struct option longopts[] = {
|
||||
{ "mount", 0, NULL, 'M' },
|
||||
{ "blockdevice", 0, NULL, 'b' },
|
||||
{ "mountargs", 0, NULL, 'm' },
|
||||
{ "options", 0, NULL, 'o' },
|
||||
{ "passno", 1, NULL, 'p' },
|
||||
{ "fstype", 1, NULL, 't' },
|
||||
@ -99,6 +140,7 @@ static const struct option longopts[] = {
|
||||
};
|
||||
static const char * const longopts_help[] = {
|
||||
"Extract the block device",
|
||||
"Mounts the filesytem from the mountpoint",
|
||||
"Extract the options field",
|
||||
"Extract or query the pass number field",
|
||||
"List entries with matching file system type",
|
||||
@ -107,18 +149,15 @@ static const char * const longopts_help[] = {
|
||||
#include "_usage.c"
|
||||
|
||||
#define OUTPUT_FILE (1 << 1)
|
||||
#define OUTPUT_MOUNTARGS (1 << 2)
|
||||
#define OUTPUT_OPTIONS (1 << 3)
|
||||
#define OUTPUT_PASSNO (1 << 4)
|
||||
#define OUTPUT_BLOCKDEV (1 << 5)
|
||||
#define OUTPUT_MOUNT (1 << 6)
|
||||
|
||||
int fstabinfo (int argc, char **argv)
|
||||
{
|
||||
#ifdef HAVE_GETMNTENT
|
||||
FILE *fp;
|
||||
struct mntent *ent;
|
||||
#else
|
||||
struct fstab *ent;
|
||||
#endif
|
||||
struct ENT *ent;
|
||||
int result = EXIT_SUCCESS;
|
||||
char *token;
|
||||
int i;
|
||||
@ -128,6 +167,10 @@ int fstabinfo (int argc, char **argv)
|
||||
char *file;
|
||||
bool filtered = false;
|
||||
|
||||
#ifdef HAVE_GETMNTENT
|
||||
FILE *fp;
|
||||
#endif
|
||||
|
||||
/* Ensure that we are only quiet when explicitly told to be */
|
||||
unsetenv ("EINFO_QUIET");
|
||||
|
||||
@ -135,12 +178,18 @@ int fstabinfo (int argc, char **argv)
|
||||
longopts, (int *) 0)) != -1)
|
||||
{
|
||||
switch (opt) {
|
||||
case 'M':
|
||||
output = OUTPUT_MOUNT;
|
||||
break;
|
||||
case 'b':
|
||||
output = OUTPUT_BLOCKDEV;
|
||||
break;
|
||||
case 'o':
|
||||
output = OUTPUT_OPTIONS;
|
||||
break;
|
||||
case 'm':
|
||||
output = OUTPUT_MOUNTARGS;
|
||||
break;
|
||||
|
||||
case 'p':
|
||||
switch (optarg[0]) {
|
||||
@ -213,6 +262,19 @@ int fstabinfo (int argc, char **argv)
|
||||
case OUTPUT_BLOCKDEV:
|
||||
printf ("%s\n", ENT_BLOCKDEVICE (ent));
|
||||
break;
|
||||
|
||||
case OUTPUT_MOUNT:
|
||||
result += do_mount (ent);
|
||||
break;
|
||||
|
||||
case OUTPUT_MOUNTARGS:
|
||||
printf ("-o %s -t %s %s %s\n",
|
||||
ENT_OPTS (ent),
|
||||
ENT_TYPE (ent),
|
||||
ENT_BLOCKDEVICE (ent),
|
||||
file);
|
||||
break;
|
||||
|
||||
case OUTPUT_OPTIONS:
|
||||
printf ("%s\n", ENT_OPTS (ent));
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user