From 58080798db321d025143df39c97f707ea994ba26 Mon Sep 17 00:00:00 2001 From: Christiaan Welvaart Date: Tue, 15 Jul 2008 11:42:42 -0400 Subject: [PATCH] Ported the create_mtab() routine from util-linux-ng as well some add_mtab() updates to better hand the instances where /etc/mtab does not exist or is not writable Signed-off-by: Christiaan Welvaart Signed-off-by: Steve Dickson --- utils/mount/fstab.c | 5 ++ utils/mount/fstab.h | 1 + utils/mount/mount.c | 114 +++++++++++++++++++++++++++++++------------- 3 files changed, 86 insertions(+), 34 deletions(-) diff --git a/utils/mount/fstab.c b/utils/mount/fstab.c index ec7ab52..e19e58b 100644 --- a/utils/mount/fstab.c +++ b/utils/mount/fstab.c @@ -46,6 +46,11 @@ get_mtab_info(void) { } } +void +reset_mtab_info(void) { + have_mtab_info = 0; +} + int mtab_does_not_exist(void) { get_mtab_info(); diff --git a/utils/mount/fstab.h b/utils/mount/fstab.h index 64c8355..0b81acc 100644 --- a/utils/mount/fstab.h +++ b/utils/mount/fstab.h @@ -9,6 +9,7 @@ int mtab_is_writable(void); int mtab_does_not_exist(void); +void reset_mtab_info(void); struct mntentchn { struct mntentchn *nxt, *prev; diff --git a/utils/mount/mount.c b/utils/mount/mount.c index d7271a1..a753932 100644 --- a/utils/mount/mount.c +++ b/utils/mount/mount.c @@ -148,6 +148,8 @@ static const struct opt_map opt_map[] = { #define MAKE_VERSION(p,q,r) (65536 * (p) + 256 * (q) + (r)) +static void parse_opts(const char *options, int *flags, char **extra_opts); + int linux_version_code(void) { struct utsname my_utsname; @@ -237,12 +239,59 @@ static char *fix_opts_string(int flags, const char *extra_opts) return new_opts; } +/* Create mtab with a root entry. */ +static void +create_mtab (void) { + struct mntentchn *fstab; + struct mntent mnt; + int flags; + mntFILE *mfp; + + lock_mtab(); + + mfp = nfs_setmntent (MOUNTED, "a+"); + if (mfp == NULL || mfp->mntent_fp == NULL) { + int errsv = errno; + die (EX_FILEIO, _("mount: can't open %s for writing: %s"), + MOUNTED, strerror (errsv)); + } + + /* Find the root entry by looking it up in fstab */ + if ((fstab = getfsfile ("/")) || (fstab = getfsfile ("root"))) { + char *extra_opts; + parse_opts (fstab->m.mnt_opts, &flags, &extra_opts); + mnt.mnt_dir = "/"; + mnt.mnt_fsname = xstrdup(fstab->m.mnt_fsname); + mnt.mnt_type = fstab->m.mnt_type; + mnt.mnt_opts = fix_opts_string (flags, extra_opts); + mnt.mnt_freq = mnt.mnt_passno = 0; + free(extra_opts); + + if (nfs_addmntent (mfp, &mnt) == 1) { + int errsv = errno; + die (EX_FILEIO, _("mount: error writing %s: %s"), + _PATH_MOUNTED, strerror (errsv)); + } + } + if (fchmod (fileno (mfp->mntent_fp), 0644) < 0) + if (errno != EROFS) { + int errsv = errno; + die (EX_FILEIO, + _("mount: error changing mode of %s: %s"), + _PATH_MOUNTED, strerror (errsv)); + } + nfs_endmntent (mfp); + + unlock_mtab(); + + reset_mtab_info(); +} + static int add_mtab(char *spec, char *mount_point, char *fstype, int flags, char *opts, int freq, int pass) { struct mntent ment; - mntFILE *mtab; - int result = EX_FILEIO; + int result = EX_SUCCESS; ment.mnt_fsname = spec; ment.mnt_dir = mount_point; @@ -251,39 +300,37 @@ static int add_mtab(char *spec, char *mount_point, char *fstype, ment.mnt_freq = freq; ment.mnt_passno = pass; - if (flags & MS_REMOUNT) { - update_mtab(ment.mnt_dir, &ment); - free(ment.mnt_opts); - return EX_SUCCESS; - } - - lock_mtab(); - - mtab = nfs_setmntent(MOUNTED, "a+"); - if (mtab == NULL || mtab->mntent_fp == NULL) { - nfs_error(_("Can't open mtab: %s"), - strerror(errno)); - goto fail_unlock; + if (!nomtab && mtab_does_not_exist()) { + if (verbose > 1) + printf(_("mount: no %s found - creating it..\n"), + MOUNTED); + create_mtab (); } - if (nfs_addmntent(mtab, &ment) == 1) { - nfs_error(_("Can't write mount entry to mtab: %s"), - strerror(errno)); - goto fail_close; - } - - if (fchmod(fileno(mtab->mntent_fp), 0644) == -1) { - nfs_error(_("Can't set permissions on mtab: %s"), - strerror(errno)); - goto fail_close; + if (!nomtab && mtab_is_writable()) { + if (flags & MS_REMOUNT) + update_mtab(ment.mnt_dir, &ment); + else { + mntFILE *mtab; + + lock_mtab(); + mtab = nfs_setmntent(MOUNTED, "a+"); + if (mtab == NULL || mtab->mntent_fp == NULL) { + nfs_error(_("Can't open mtab: %s"), + strerror(errno)); + result = EX_FILEIO; + } else { + if (nfs_addmntent(mtab, &ment) == 1) { + nfs_error(_("Can't write mount entry to mtab: %s"), + strerror(errno)); + result = EX_FILEIO; + } + } + nfs_endmntent(mtab); + unlock_mtab(); + } } - result = EX_SUCCESS; - -fail_close: - nfs_endmntent(mtab); -fail_unlock: - unlock_mtab(); free(ment.mnt_opts); return result; @@ -409,9 +456,8 @@ static int try_mount(char *spec, char *mount_point, int flags, if (!fake) print_one(spec, mount_point, fs_type, mount_opts); - if (!nomtab) - ret = add_mtab(spec, mount_point, fs_type, flags, *extra_opts, - 0, 0 /* these are always zero for NFS */ ); + ret = add_mtab(spec, mount_point, fs_type, flags, *extra_opts, + 0, 0 /* these are always zero for NFS */ ); return ret; } -- 2.39.2