#include "mount_constants.h"
#include "mount.h"
#include "nfsumount.h"
+#include "error.h"
#if !defined(MNT_FORCE)
/* dare not try to include <linux/mount.h> -- lots of errors */
return res;
}
-/* complain about a failed umount */
-static void complain(int err, const char *dev) {
- switch (err) {
- case ENXIO:
- nfs_error (_("umount: %s: invalid block device"), dev); break;
- case EINVAL:
- nfs_error (_("umount: %s: not mounted"), dev); break;
- case EIO:
- nfs_error (_("umount: %s: can't write superblock"), dev); break;
- case EBUSY:
- /* Let us hope fstab has a line "proc /proc ..."
- and not "none /proc ..."*/
- nfs_error (_("umount: %s: device is busy"), dev); break;
- case ENOENT:
- nfs_error (_("umount: %s: not found"), dev); break;
- case EPERM:
- nfs_error (_("umount: %s: must be superuser to umount"), dev); break;
- case EACCES:
- nfs_error (_("umount: %s: block devices not permitted on fs"), dev); break;
- default:
- nfs_error (_("umount: %s: %s"), dev, strerror (err)); break;
- }
-}
-
int del_mtab(const char *spec, const char *node)
{
int umnt_err, res;
return 0;
if (umnt_err)
- complain(umnt_err, node);
+ umount_error(umnt_err, node);
return 1;
}
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) {
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);
int len;
if (!opt)
goto only_root;
- if (opt[5] != '=')
+ if (opt[4] != '=')
goto only_root;
comma = strchr(opt, ',');
if (comma)
ret = 0;
if (mc) {
if (!lazy)
- ret = _nfsumount(mc->m.mnt_fsname, mc->m.mnt_opts);
- if(ret)
- ret = del_mtab(mc->m.mnt_fsname, mc->m.mnt_dir);
+ _nfsumount(mc->m.mnt_fsname, mc->m.mnt_opts);
+ ret = del_mtab(mc->m.mnt_fsname, mc->m.mnt_dir);
} else if (*spec != '/') {
if (!lazy)
- ret = _nfsumount(spec, "tcp,v3");
+ _nfsumount(spec, "tcp,v3");
} else
ret = del_mtab(NULL, spec);