]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - support/nfs/fstab.c
exportfs: Use xlog() for error reporting
[nfs-utils.git] / support / nfs / fstab.c
index 8dc7d66315376c4e51abbeeabfdb63a431ae7874..b4f8710ba2d3a5c75f286af4ee0c7320a17009ea 100644 (file)
@@ -80,16 +80,28 @@ 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);
 
-struct mntentchn *
-mtab_head() {
+static struct mntentchn *
+mtab_head(void) {
        if (!got_mtab)
                read_mounttable();
        return &mounttable;
 }
 
+static struct mntentchn *
+fstab_head(void)
+{
+       if (!got_fstab)
+               read_fstab();
+       return &fstab;
+}
+
+#if 0
 static void
 my_free(const void *s) {
        if (s)
@@ -109,11 +121,12 @@ discard_mntentchn(struct mntentchn *mc0) {
                free(mc);
        }
 }
+#endif
 
 static void
 read_mntentchn(mntFILE *mfp, const char *fnam, struct mntentchn *mc0) {
        struct mntentchn *mc = mc0;
-       nfs_mntent_t *mnt;
+       struct mntent *mnt;
 
        while ((mnt = nfs_getmntent(mfp)) != NULL) {
                if (!streq(mnt->mnt_type, MNTTYPE_IGNORE)) {
@@ -167,6 +180,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;
+               nfs_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 +235,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. */
@@ -386,7 +446,8 @@ lock_mtab (void) {
  */
 
 void
-update_mtab (const char *dir, nfs_mntent_t *instead) {
+update_mtab (const char *dir, struct mntent *instead)
+{
        mntFILE *mfp, *mftmp;
        const char *fnam = MOUNTED;
        struct mntentchn mtabhead;      /* dummy */
@@ -455,8 +516,14 @@ update_mtab (const char *dir, nfs_mntent_t *instead) {
                }
        }
 
+#if 0
+       /* the chain might have strings copied from 'instead',
+        * so we cannot safely free it.
+        * And there is no need anyway because we are going to exit
+        * shortly.  So just don't call discard_mntentchn....
+        */
        discard_mntentchn(mc0);
-
+#endif
        if (fchmod (fileno (mftmp->mntent_fp),
                    S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH) < 0) {
                int errsv = errno;