X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;ds=sidebyside;f=utils%2Fmount%2Fstropts.c;h=a51cf0b720fbfee20d085c959911c5bf91d30826;hb=abb44f59bd004112a217011a2560dd7c7f94b5a2;hp=e2e72a7c552cdce84eb6d68e99b617fb1df6bac2;hpb=586a66451679e25c47cb8cd65a0c6a0c44148920;p=nfs-utils.git diff --git a/utils/mount/stropts.c b/utils/mount/stropts.c index e2e72a7..a51cf0b 100644 --- a/utils/mount/stropts.c +++ b/utils/mount/stropts.c @@ -49,6 +49,7 @@ #include "network.h" #include "parse_opt.h" #include "version.h" +#include "parse_dev.h" #ifdef HAVE_RPCSVC_NFS_PROT_H #include @@ -98,78 +99,6 @@ struct nfsmount_info { sa_family_t family; /* supported address family */ }; -static int nfs_parse_devname(struct nfsmount_info *mi) -{ - int ret = 0; - char *dev, *pathname, *s; - - dev = xstrdup(mi->spec); - - if (!(pathname = strchr(dev, ':'))) { - nfs_error(_("%s: remote share not in 'host:dir' format"), - progname); - goto out; - } - *pathname = '\0'; - pathname++; - - /* - * We don't need a copy of the pathname, but let's - * sanity check it anyway. - */ - if (strlen(pathname) > NFS_MAXPATHNAME) { - nfs_error(_("%s: export pathname is too long"), - progname); - goto out; - } - - /* - * Ignore all but first hostname in replicated mounts - * until they can be fully supported. (mack@sgi.com) - */ - if ((s = strchr(dev, ','))) { - *s = '\0'; - nfs_error(_("%s: warning: multiple hostnames not supported"), - progname); - nfs_error(_("%s: ignoring hostnames that follow the first one"), - progname); - } - mi->hostname = xstrdup(dev); - if (strlen(mi->hostname) > NFS_MAXHOSTNAME) { - nfs_error(_("%s: server hostname is too long"), - progname); - free(mi->hostname); - mi->hostname = NULL; - goto out; - } - - ret = 1; - -out: - free(dev); - return ret; -} - -static int fill_ipv4_sockaddr(const char *hostname, struct sockaddr_in *addr) -{ - struct hostent *hp; - addr->sin_family = AF_INET; - - if (inet_aton(hostname, &addr->sin_addr)) - return 1; - if ((hp = gethostbyname(hostname)) == NULL) { - nfs_error(_("%s: can't get address for %s\n"), - progname, hostname); - return 0; - } - if (hp->h_length > sizeof(struct in_addr)) { - nfs_error(_("%s: got bad hp->h_length"), progname); - hp->h_length = sizeof(struct in_addr); - } - memcpy(&addr->sin_addr, hp->h_addr, hp->h_length); - return 1; -} - /* * Obtain a retry timeout value based on the value of the "retry=" option. * @@ -334,14 +263,18 @@ static int nfs_append_sloppy_option(struct mount_options *options) */ static int nfs_validate_options(struct nfsmount_info *mi) { - struct sockaddr_in saddr; + struct sockaddr_storage dummy; + struct sockaddr *sap = (struct sockaddr *)&dummy; + socklen_t salen = sizeof(dummy); + + if (!nfs_parse_devname(mi->spec, &mi->hostname, NULL)) + return 0; - if (!fill_ipv4_sockaddr(mi->hostname, &saddr)) + if (!nfs_name_to_address(mi->hostname, mi->family, sap, &salen)) return 0; if (strncmp(mi->type, "nfs4", 4) == 0) { - if (!nfs_append_clientaddr_option((struct sockaddr *)&saddr, - sizeof(saddr), mi->options)) + if (!nfs_append_clientaddr_option(sap, salen, mi->options)) return 0; } else { if (!nfs_fix_mounthost_option(mi->family, mi->options)) @@ -353,8 +286,7 @@ static int nfs_validate_options(struct nfsmount_info *mi) if (!nfs_append_sloppy_option(mi->options)) return 0; - return nfs_append_addr_option((struct sockaddr *)&saddr, - sizeof(saddr), mi->options); + return nfs_append_addr_option(sap, salen, mi->options); } /* @@ -812,9 +744,6 @@ int nfsmount_string(const char *spec, const char *node, const char *type, }; int retval = EX_FAIL; - if (!nfs_parse_devname(&mi)) - return retval; - mi.options = po_split(*extra_opts); if (mi.options) { retval = nfsmount_start(&mi);