X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fmount%2Fnfsumount.c;h=e65f58f0122374ad92f881d96e7072a9f0fbe03e;hp=381ca6e344e0bdf13d21a1760a651597f8777325;hb=6facb22402a0bd8cd49be2ed1a0856b24fef42f4;hpb=03187a3cf1995b487c291ea8bc746a9e29e1c2f4 diff --git a/utils/mount/nfsumount.c b/utils/mount/nfsumount.c index 381ca6e..e65f58f 100644 --- a/utils/mount/nfsumount.c +++ b/utils/mount/nfsumount.c @@ -190,7 +190,7 @@ int del_mtab(const char *spec, const char *node) /* * Returns 1 if everything went well, else 0. */ -int _nfsumount(const char *spec, const char *opts) +int _nfsumount(const char *spec, char *opts) { char *hostname; char *dirname; @@ -252,7 +252,7 @@ int _nfsumount(const char *spec, const 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)