--- nfs-utils-1.0.9/utils/mount/mount.c.orig 2006-10-25 10:52:32.000000000 -0400 +++ nfs-utils-1.0.9/utils/mount/mount.c 2006-10-25 12:09:52.000000000 -0400 @@ -163,16 +163,29 @@ static char * fix_opts_string (int flags return new_opts; } -void copy_mntent(struct mntent *ment, nfs_mntent_t *nment) +static inline void dup_mntent(struct mntent *ment, nfs_mntent_t *nment) { /* Not sure why nfs_mntent_t should exist */ - strcpy(nment->mnt_fsname, ment->mnt_fsname); - strcpy(nment->mnt_dir, ment->mnt_dir); - strcpy(nment->mnt_type, ment->mnt_type); - strcpy(nment->mnt_opts, ment->mnt_opts); + nment->mnt_fsname = strdup(ment->mnt_fsname); + nment->mnt_dir = strdup(ment->mnt_dir); + nment->mnt_type = strdup(ment->mnt_type); + nment->mnt_opts = strdup(ment->mnt_opts); nment->mnt_freq = ment->mnt_freq; nment->mnt_passno = ment->mnt_passno; } +static inline void +free_mntent(struct mntent *ment, int remount) +{ + free(ment->mnt_fsname); + free(ment->mnt_dir); + free(ment->mnt_type); + /* + * Note: free(ment->mnt_opts) happens in discard_mntentchn() + * via update_mtab() on remouts + */ + if (!remount) + free(ment->mnt_opts); +} int add_mtab(char *fsname, char *mount_point, char *fstype, int flags, char *opts, int freq, int passno) { @@ -190,8 +203,9 @@ int add_mtab(char *fsname, char *mount_p if(flags & MS_REMOUNT) { nfs_mntent_t nment; - copy_mntent(&ment, &nment); + dup_mntent(&ment, &nment); update_mtab(nment.mnt_dir, &nment); + free_mntent(&nment, 1); return 0; } @@ -341,10 +355,11 @@ static void mount_error(char *node) fprintf(stderr, "%s: %s\n", progname, strerror(errno)); } } +#define NFS_MOUNT_VERS_DEFAULT 3 int main(int argc, char *argv[]) { - int c, flags = 0, nfs_mount_vers = 0, mnt_err = 1, fake = 0; + int c, flags = 0, nfs_mount_vers, mnt_err = 1, fake = 0; char *spec, *mount_point, *extra_opts = NULL; char *mount_opts = NULL, *p; struct mntentchn *mc; @@ -375,6 +390,10 @@ int main(int argc, char *argv[]) return 0; } + nfs_mount_vers = NFS_MOUNT_VERS_DEFAULT; + if (!strcmp(progname, "mount.nfs4")) + nfs_mount_vers = 4; + while ((c = getopt_long (argc - 2, argv + 2, "rt:vVwfno:hs", longopts, NULL)) != -1) { switch (c) { @@ -465,9 +484,9 @@ int main(int argc, char *argv[]) } } - if (!strcmp(progname, "mount.nfs4") || nfs_mount_vers == 4) { - nfs_mount_vers = 4; - mnt_err = nfs4mount(spec, mount_point, &flags, &extra_opts, &mount_opts, 0); + if (nfs_mount_vers == 4) { + mnt_err = nfs4mount(spec, mount_point, &flags, + &extra_opts, &mount_opts, 0); } else { if (!strcmp(progname, "mount.nfs")) { @@ -475,21 +494,19 @@ int main(int argc, char *argv[]) &extra_opts, &mount_opts, &nfs_mount_vers, 0); } } - if (fake) return 0; if (mnt_err) exit(EX_FAIL); - if(!(flags & MS_REMOUNT)) { - mnt_err = do_mount_syscall(spec, mount_point, - nfs_mount_vers == 4 ? "nfs4" : "nfs", flags, mount_opts); - - if(mnt_err) { - mount_error(mount_point); - exit(EX_FAIL); - } + mnt_err = do_mount_syscall(spec, mount_point, + nfs_mount_vers == 4 ? "nfs4" : "nfs", flags, mount_opts); + + if(mnt_err) { + mount_error(mount_point); + exit(EX_FAIL); } + if(!nomtab) { add_mtab(spec, mount_point, nfs_mount_vers == 4 ? "nfs4" : "nfs", flags, extra_opts, 0, 0);