summaryrefslogtreecommitdiffstats
path: root/support
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2007-03-16 18:07:41 +1100
committerNeil Brown <neilb@suse.de>2007-03-16 18:07:41 +1100
commitae5ec51e0ddc99dc5552e51bd5c095084dbb61aa (patch)
tree0063a8cbcf2bd6e94855e1fa8a94d2ff39652d0e /support
parent3eb4c9aaa218f2af4bbea2073f02e419c50d3d3d (diff)
Correctly handle "user" and "users" mount options.
If "user" or "users" is given, then allow mount.nfs to be run by a non-root user providing that the mountpoint, filesystem, and options exactly match what is found in fstab. For "user", record the user name in mtab so they can unmount the filesystem later. Also alwasys ignore auto, owner, group and their negations as well as "_netdev", "comment" and "loop".
Diffstat (limited to 'support')
-rw-r--r--support/include/fstab.h7
-rw-r--r--support/nfs/fstab.c58
2 files changed, 65 insertions, 0 deletions
diff --git a/support/include/fstab.h b/support/include/fstab.h
index 8053066..ab30c5a 100644
--- a/support/include/fstab.h
+++ b/support/include/fstab.h
@@ -3,6 +3,10 @@
#include "nfs_mntent.h"
+#ifndef _PATH_FSTAB
+#define _PATH_FSTAB "/etc/fstab"
+#endif
+
int mtab_is_writable(void);
int mtab_does_not_exist(void);
@@ -15,6 +19,9 @@ struct mntentchn *getmntoptfile (const char *file);
struct mntentchn *getmntdirbackward (const char *dir, struct mntentchn *mc);
struct mntentchn *getmntdevbackward (const char *dev, struct mntentchn *mc);
+struct mntentchn *getfsfile (const char *file);
+struct mntentchn *getfsspec (const char *spec);
+
void lock_mtab (void);
void unlock_mtab (void);
void update_mtab (const char *special, nfs_mntent_t *with);
diff --git a/support/nfs/fstab.c b/support/nfs/fstab.c
index 23ea927..ba7e580 100644
--- a/support/nfs/fstab.c
+++ b/support/nfs/fstab.c
@@ -80,8 +80,11 @@ mtab_is_writable() {
struct mntentchn mounttable;
static int got_mtab = 0;
+struct mntentchn fstab;
+static int got_fstab = 0;
static void read_mounttable(void);
+static void read_fstab(void);
static struct mntentchn *
mtab_head() {
@@ -90,6 +93,14 @@ mtab_head() {
return &mounttable;
}
+static struct mntentchn *
+fstab_head()
+{
+ if (!got_fstab)
+ read_fstab();
+ return &fstab;
+}
+
static void
my_free(const void *s) {
if (s)
@@ -167,6 +178,27 @@ read_mounttable() {
read_mntentchn(mfp, fnam, mc);
}
+static void
+read_fstab()
+{
+ mntFILE *mfp = NULL;
+ const char *fnam;
+ struct mntentchn *mc = &fstab;
+
+ got_fstab = 1;
+ mc->nxt = mc->prev = NULL;
+
+ fnam = _PATH_FSTAB;
+ mfp = nfs_setmntent (fnam, "r");
+ if (mfp == NULL || mfp->mntent_fp == NULL) {
+ int errsv = errno;
+ error(_("warning: can't open %s: %s"),
+ _PATH_FSTAB, strerror (errsv));
+ return;
+ }
+ read_mntentchn(mfp, fnam, mc);
+}
+
/*
* Given the directory name NAME, and the place MCPREV we found it last time,
* try to find more occurrences.
@@ -201,6 +233,32 @@ getmntdevbackward (const char *name, struct mntentchn *mcprev) {
return NULL;
}
+/* Find the dir FILE in fstab. */
+struct mntentchn *
+getfsfile (const char *file)
+{
+ struct mntentchn *mc, *mc0;
+
+ mc0 = fstab_head();
+ for (mc = mc0->nxt; mc && mc != mc0; mc = mc->nxt)
+ if (streq(mc->m.mnt_dir, file))
+ return mc;
+ return NULL;
+}
+
+/* Find the device SPEC in fstab. */
+struct mntentchn *
+getfsspec (const char *spec)
+{
+ struct mntentchn *mc, *mc0;
+
+ mc0 = fstab_head();
+ for (mc = mc0->nxt; mc && mc != mc0; mc = mc->nxt)
+ if (streq(mc->m.mnt_fsname, spec))
+ return mc;
+ return NULL;
+}
+
/* Updating mtab ----------------------------------------------*/
/* Flag for already existing lock file. */