]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - support/nfs/fstab.c
Correctly handle "user" and "users" mount options.
[nfs-utils.git] / support / nfs / fstab.c
index 23ea927cc8b80624463345679a18fe5bda16db6c..ba7e580eb08f97978bee156a9e81ecc6dc4b0120 100644 (file)
@@ -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. */