#include "mount.h"
#include "error.h"
#include "network.h"
+#include "parse_dev.h"
#if !defined(MNT_FORCE)
/* dare not try to include <linux/mount.h> -- lots of errors */
* We will need this information to get through the firewall again
* to do the umount.
*/
-static int do_nfs_umount(const char *spec, char *opts)
+static int do_nfs_umount23(const char *spec, char *opts)
{
char *hostname;
char *dirname;
struct mntent mnt = { .mnt_opts = opts };
struct pmap *pmap = &mnt_server.pmap;
char *p;
+ int result = EX_USAGE;
+
+ if (!nfs_parse_devname(spec, &hostname, &dirname))
+ return result;
- if (spec == NULL) {
- nfs_error(_("%s: No NFS export name was provided"),
- progname);
- return EX_USAGE;
- }
-
- p = strchr(spec, ':');
- if (p == NULL) {
- nfs_error(_("%s: '%s' is not a legal NFS export name"),
- progname, spec);
- return EX_USAGE;
- }
- hostname = xstrndup(spec, p - spec);
- dirname = xstrdup(p + 1);
#ifdef NFS_MOUNT_DEBUG
printf(_("host: %s, directory: %s\n"), hostname, dirname);
#endif
}
pmap->pm_prog = MOUNTPROG;
- pmap->pm_vers = MOUNTVERS_NFSV3;
+ pmap->pm_vers = 0; /* unknown */
if (opts && (p = strstr(opts, "mountprog=")) && isdigit(*(p+10)))
pmap->pm_prog = atoi(p+10);
if (opts && (p = strstr(opts, "mountport=")) && isdigit(*(p+10)))
pmap->pm_vers = nfsvers_to_mnt(2);
if (opts && hasmntopt(&mnt, "v3"))
pmap->pm_vers = nfsvers_to_mnt(3);
- if (opts && hasmntopt(&mnt, "v4"))
- pmap->pm_vers = nfsvers_to_mnt(4);
if (opts && (p = strstr(opts, "vers=")) && isdigit(*(p+5)))
pmap->pm_vers = nfsvers_to_mnt(atoi(p+5));
if (opts && (p = strstr(opts, "mountvers=")) && isdigit(*(p+10)))
pmap->pm_prot = IPPROTO_TCP;
if (!nfs_gethostbyname(hostname, &mnt_server.saddr)) {
- nfs_error(_("%s: '%s' does not contain a recognized hostname"),
- progname, spec);
- return EX_USAGE;
+ nfs_error(_("%s: DNS resolution of '%s' failed"),
+ progname, hostname);
+ goto out;
}
if (!nfs_call_umount(&mnt_server, &dirname)) {
nfs_error(_("%s: Server failed to unmount '%s'"),
progname, spec);
- return EX_USAGE;
+ result = EX_FAIL;
+ goto out;
}
- return EX_SUCCESS;
+ result = EX_SUCCESS;
+
+out:
+ free(hostname);
+ free(dirname);
+ return result;
}
static struct option umount_longopts[] =
ret = 0;
if (mc) {
if (!lazy && strcmp(mc->m.mnt_type, "nfs4") != 0)
- ret = do_nfs_umount(mc->m.mnt_fsname, mc->m.mnt_opts);
- if (!ret || force)
- ret = del_mtab(mc->m.mnt_fsname, mc->m.mnt_dir);
+ ret = do_nfs_umount23(mc->m.mnt_fsname, mc->m.mnt_opts);
+ ret = del_mtab(mc->m.mnt_fsname, mc->m.mnt_dir) ?: ret;
} else if (*spec != '/') {
if (!lazy)
- ret = do_nfs_umount(spec, "tcp,v3");
+ ret = do_nfs_umount23(spec, "tcp,v3");
} else
ret = del_mtab(NULL, spec);