]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/mount/mount_libmount.c
umount.nfs: ignore non-nfs filesystems
[nfs-utils.git] / utils / mount / mount_libmount.c
index cf6e58c512ade3235ab63cbf1089c6c85cd1f756..ddf61b20913f5931bc47157dce6b5962646b9333 100644 (file)
@@ -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
         */