summaryrefslogtreecommitdiffstats
path: root/utils/mount/nfsumount.c
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2007-03-16 18:29:39 +1100
committerNeil Brown <neilb@suse.de>2007-03-16 18:29:39 +1100
commit03187a3cf1995b487c291ea8bc746a9e29e1c2f4 (patch)
treea0a34920ee46df1348d57f6e761541c9c3b1f43e /utils/mount/nfsumount.c
parenta64b65aac7af65f96a24cd89fc07a31dbb5980ab (diff)
downloadnfs-utils-03187a3cf1995b487c291ea8bc746a9e29e1c2f4.tar.gz
nfs-utils-03187a3cf1995b487c291ea8bc746a9e29e1c2f4.tar.xz
nfs-utils-03187a3cf1995b487c291ea8bc746a9e29e1c2f4.zip
Support unmount by not privileged users
Providing user=username or users is listed in mtab.
Diffstat (limited to 'utils/mount/nfsumount.c')
-rw-r--r--utils/mount/nfsumount.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/utils/mount/nfsumount.c b/utils/mount/nfsumount.c
index eb3d1fb..381ca6e 100644
--- a/utils/mount/nfsumount.c
+++ b/utils/mount/nfsumount.c
@@ -17,12 +17,14 @@
*
*/
+#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <getopt.h>
#include <mntent.h>
#include <sys/mount.h>
#include <ctype.h>
+#include <pwd.h>
#include "xcommon.h"
#include "fstab.h"
@@ -324,6 +326,35 @@ int nfsumount(int argc, char *argv[])
if (!mc && verbose)
printf(_("Could not find %s in mtab\n"), spec);
+ if (getuid() != 0) {
+ /* only permitted if "user=" or "users" is in mount options */
+ if (!mc) {
+ only_root:
+ fprintf(stderr,"%s: You are not permitted to unmount %s\n",
+ progname, spec);
+ return 0;
+ }
+ if (hasmntopt(&mc->m, "users") == NULL) {
+ char *opt = hasmntopt(&mc->m, "user");
+ struct passwd *pw;
+ char *comma;
+ int len;
+ if (!opt)
+ goto only_root;
+ if (opt[5] != '=')
+ goto only_root;
+ comma = strchr(opt, ',');
+ if (comma)
+ len = comma - (opt + 5);
+ else
+ len = strlen(opt+5);
+ pw = getpwuid(getuid());
+ if (pw == NULL || strlen(pw->pw_name) != len
+ || strncmp(pw->pw_name, opt+5, len) != 0)
+ goto only_root;
+ }
+ }
+
ret = 0;
if (mc) {
if (!lazy)