+/*
+ * Returns EX_SUCCESS if mount options and device name have been
+ * parsed successfully; otherwise EX_FAIL.
+ */
+static int nfs_umount_do_umnt(struct mount_options *options,
+ char **hostname, char **dirname)
+{
+ struct sockaddr_storage address;
+ struct sockaddr *sap = (struct sockaddr *)&address;
+ socklen_t salen = sizeof(address);
+ struct pmap nfs_pmap, mnt_pmap;
+
+ nfs_options2pmap(options, &nfs_pmap, &mnt_pmap);
+
+ *hostname = nfs_umount_hostname(options, *hostname);
+ if (!*hostname) {
+ nfs_error(_("%s: out of memory"), progname);
+ return EX_FAIL;
+ }
+
+ if (nfs_name_to_address(*hostname, AF_UNSPEC, sap, &salen)) {
+ if (nfs_advise_umount(sap, salen, &mnt_pmap, dirname) != 0)
+ return EX_SUCCESS;
+ else
+ nfs_error(_("%s: Server failed to unmount '%s:%s'"),
+ progname, *hostname, *dirname);
+ }
+ return EX_FAIL;