X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=support%2Fnfs%2Ffstab.c;h=b4f8710ba2d3a5c75f286af4ee0c7320a17009ea;hp=8dc7d66315376c4e51abbeeabfdb63a431ae7874;hb=26fd34002585e6a5aa09204b0b01d836fa83dcf3;hpb=4e2bae795e5eaf9922f0b966ab5df64994c836a2 diff --git a/support/nfs/fstab.c b/support/nfs/fstab.c index 8dc7d66..b4f8710 100644 --- a/support/nfs/fstab.c +++ b/support/nfs/fstab.c @@ -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;