return result;
}
-/*
- * Pick up certain mount options used during the original mount
- * from /etc/mtab. The basics include the server's IP address and
- * the server pathname of the share to unregister.
- *
- * These options might also describe the mount port, mount protocol
- * version, and transport protocol used to punch through a firewall.
- * We will need this information to get through the firewall again
- * to do the umount.
- */
-static int do_nfs_umount23(const char *spec, char *opts)
-{
- char *hostname;
- char *dirname;
- clnt_addr_t mnt_server = { &hostname, };
- 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;
-
-#ifdef NFS_MOUNT_DEBUG
- printf(_("host: %s, directory: %s\n"), hostname, dirname);
-#endif
-
- if (opts && (p = strstr(opts, "addr="))) {
- char *q;
-
- free(hostname);
- p += 5;
- q = p;
- while (*q && *q != ',') q++;
- hostname = xstrndup(p,q-p);
- }
-
- if (opts && (p = strstr(opts, "mounthost="))) {
- char *q;
-
- free(hostname);
- p += 10;
- q = p;
- while (*q && *q != ',') q++;
- hostname = xstrndup(p,q-p);
- }
-
- pmap->pm_prog = MOUNTPROG;
- 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_port = atoi(p+10);
- if (opts && hasmntopt(&mnt, "v2"))
- pmap->pm_vers = nfsvers_to_mnt(2);
- if (opts && hasmntopt(&mnt, "v3"))
- pmap->pm_vers = nfsvers_to_mnt(3);
- 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_vers = atoi(p+10);
- if (opts && (hasmntopt(&mnt, "udp")
- || hasmntopt(&mnt, "proto=udp")
- || hasmntopt(&mnt, "mountproto=udp")
- ))
- pmap->pm_prot = IPPROTO_UDP;
- if (opts && (hasmntopt(&mnt, "tcp")
- || hasmntopt(&mnt, "proto=tcp")
- || hasmntopt(&mnt, "mountproto=tcp")
- ))
- pmap->pm_prot = IPPROTO_TCP;
-
- if (!nfs_gethostbyname(hostname, &mnt_server.saddr)) {
- 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);
- result = EX_FAIL;
- goto out;
- }
-
- result = EX_SUCCESS;
-
-out:
- free(hostname);
- free(dirname);
- return result;
-}
-
static struct option umount_longopts[] =
{
{ "force", 0, 0, 'f' },