- 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")))
- pmap->pm_prot = IPPROTO_UDP;
- if (opts && (hasmntopt(&mnt, "tcp") || hasmntopt(&mnt, "proto=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;
- }