- char *hostname;
- char *dirname;
- clnt_addr_t mnt_server = { &hostname, };
- struct pmap *pmap = &mnt_server.pmap;
- char *p;
-
- nfs_mount_version = find_kernel_nfs_mount_version();
- if (spec == NULL || (p = strchr(spec,':')) == NULL)
- goto out_bad;
- hostname = xstrndup(spec, p-spec);
- dirname = xstrdup(p+1);
-#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 = MOUNTVERS;
- pmap->pm_prot = get_mntproto(spec);
- 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 && (p = strstr(opts, "nfsvers=")) && isdigit(*(p+8)))
- pmap->pm_vers = nfsvers_to_mnt(atoi(p+8));
- if (opts && (p = strstr(opts, "mountvers=")) && isdigit(*(p+10)))
- pmap->pm_vers = atoi(p+10);
-
- if (!nfs_gethostbyname(hostname, &mnt_server.saddr))
- goto out_bad;
- if (!probe_mntport(&mnt_server))
- goto out_bad;
- return nfs_call_umount(&mnt_server, &dirname);
- out_bad:
- fprintf(stderr, "%s: %s: not found or not mounted\n", progname, spec);
- return 0;
+ char *hostname, *dirname;
+ struct mount_options *options;
+ int result = EX_FAIL;
+
+ if (!nfs_parse_devname(devname, &hostname, &dirname))
+ return EX_USAGE;
+
+ options = po_split(string);
+ if (options) {
+ result = nfs_umount_do_umnt(options, &hostname, &dirname);
+ po_destroy(options);
+ } else
+ nfs_error(_("%s: option parsing error"), progname);
+
+ free(hostname);
+ free(dirname);
+ return result;