]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/mount/nfsumount.c
Build mount.nfs by default, and install setuid
[nfs-utils.git] / utils / mount / nfsumount.c
index 1d10cc689b5c46b0d4d55838a389cd39be5fb52b..e65f58f0122374ad92f881d96e7072a9f0fbe03e 100644 (file)
@@ -252,7 +252,7 @@ int _nfsumount(const char *spec, char *opts)
                goto out_bad;
        return nfs_call_umount(&mnt_server, &dirname);
  out_bad:
-       printf("%s: %s: not found or not mounted\n", progname, spec);
+       fprintf(stderr, "%s: %s: not found or not mounted\n", progname, spec);
        return 0;
 }
 
@@ -288,6 +288,7 @@ int nfsumount(int argc, char *argv[])
        argv += 1;
        argc -= 1;
 
+       argv[0] = argv[-1]; /* So that getopt error messages are correct */
        while ((c = getopt_long (argc, argv, "fvnrlh",
                                umount_longopts, NULL)) != -1) {
 
@@ -313,6 +314,10 @@ int nfsumount(int argc, char *argv[])
                        return 0;
                }
        }
+       if (optind != argc) {
+               umount_usage();
+               return 0;
+       }
        
        if (spec == NULL || (*spec != '/' && strchr(spec,':') == NULL)) {
                printf(_("umount: %s: not found\n"), spec);
@@ -326,9 +331,21 @@ int nfsumount(int argc, char *argv[])
        if (!mc && verbose)
                printf(_("Could not find %s in mtab\n"), spec);
 
+       if (mc && strcmp(mc->m.mnt_type, "nfs") != 0 &&
+           strcmp(mc->m.mnt_type, "nfs4") != 0) {
+               fprintf(stderr, "umount.nfs: %s on %s it not an nfs filesystem\n",
+                       mc->m.mnt_fsname, mc->m.mnt_dir);
+               exit(1);
+       }
+
        if (getuid() != 0) {
                /* only permitted if "user=" or "users" is in mount options */
                if (!mc) {
+                       /* umount might call us twice.  The second time there will
+                        * be no entry in mtab and we should just exit quietly
+                        */
+                       return 0;
+
                only_root:
                        fprintf(stderr,"%s: You are not permitted to unmount %s\n",
                                progname, spec);
@@ -341,7 +358,7 @@ int nfsumount(int argc, char *argv[])
                        int len;
                        if (!opt)
                                goto only_root;
-                       if (opt[5] != '=')
+                       if (opt[4] != '=')
                                goto only_root;
                        comma = strchr(opt, ',');
                        if (comma)