X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fmount%2Fmount_libmount.c;h=ddf61b20913f5931bc47157dce6b5962646b9333;hp=cf6e58c512ade3235ab63cbf1089c6c85cd1f756;hb=808fd6bc68e00a686f8eed7e31f682a9128bdf9b;hpb=151a82d9c80315caff7081f16916d1913a67033a diff --git a/utils/mount/mount_libmount.c b/utils/mount/mount_libmount.c index cf6e58c..ddf61b2 100644 --- a/utils/mount/mount_libmount.c +++ b/utils/mount/mount_libmount.c @@ -15,8 +15,8 @@ * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 021110-1307, USA. + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 0211-1301 USA * */ @@ -173,6 +173,7 @@ static int umount_main(struct libmnt_context *cxt, int argc, char **argv) { int rc, c; char *spec = NULL, *opts = NULL; + int ret = EX_FAIL; static const struct option longopts[] = { { "force", 0, 0, 'f' }, @@ -209,8 +210,6 @@ static int umount_main(struct libmnt_context *cxt, int argc, char **argv) if (mnt_context_set_target(cxt, spec)) goto err; - if (mnt_context_set_fstype_pattern(cxt, "nfs,nfs4")) /* restrict filesystems */ - goto err; /* read mtab/fstab, evaluate permissions, etc. */ rc = mnt_context_prepare_umount(cxt); @@ -220,6 +219,14 @@ static int umount_main(struct libmnt_context *cxt, int argc, char **argv) goto err; } + if (mnt_context_get_fstype(cxt) && + !mnt_match_fstype(mnt_context_get_fstype(cxt), "nfs,nfs4")) { + + nfs_error(_("%s: %s: is not an NFS filesystem"), progname, spec); + ret = EX_USAGE; + goto err; + } + opts = retrieve_mount_options(mnt_context_get_fs(cxt)); if (!mnt_context_is_lazy(cxt)) { @@ -244,6 +251,7 @@ static int umount_main(struct libmnt_context *cxt, int argc, char **argv) nfs_umount23(spec, "tcp,v3"); } + ret = EX_FILEIO; rc = mnt_context_do_umount(cxt); /* call umount(2) syscall */ mnt_context_finalize_mount(cxt); /* mtab update */ @@ -252,12 +260,10 @@ static int umount_main(struct libmnt_context *cxt, int argc, char **argv) umount_error(rc, spec); goto err; } - - free(opts); - return EX_SUCCESS; + ret = EX_SUCCESS; err: free(opts); - return EX_FAIL; + return ret; } static int mount_main(struct libmnt_context *cxt, int argc, char **argv) @@ -346,6 +352,21 @@ static int mount_main(struct libmnt_context *cxt, int argc, char **argv) if (chk_mountpoint(mount_point)) goto err; + + /* + * The libmount strictly uses only options from fstab if running in + * restricted mode (suid, non-root user). This is done in + * mnt_context_prepare_mount() by default. + * + * We have to read fstab before nfsmount.conf, otherwise the options + * from nfsmount.conf will be ignored (overwrited). + */ + rc = mnt_context_apply_fstab(cxt); + if (rc) { + nfs_error(_("%s: failed to apply fstab options\n"), progname); + goto err; + } + /* * Concatenate mount options from the configuration file */