X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=utils%2Fmount%2Fstropts.c;h=ec95b78619a2c7ab342bfcb20d0863252d4bd01f;hb=2b8bc77817f45759346593eaedebaacddea05978;hp=319be71aac195ca020ee01cd69f47ba419a81752;hpb=3163dabcf0a6b992859508368baf67c918d2c091;p=nfs-utils.git diff --git a/utils/mount/stropts.c b/utils/mount/stropts.c index 319be71..ec95b78 100644 --- a/utils/mount/stropts.c +++ b/utils/mount/stropts.c @@ -87,8 +87,6 @@ struct nfsmount_info { int flags, /* MS_ flags */ fake, /* actually do the mount? */ child; /* forked bg child? */ - - sa_family_t family; /* supported address family */ }; /* @@ -198,8 +196,7 @@ static int nfs_append_clientaddr_option(const struct sockaddr *sap, * Resolve the 'mounthost=' hostname and append a new option using * the resulting address. */ -static int nfs_fix_mounthost_option(const sa_family_t family, - struct mount_options *options) +static int nfs_fix_mounthost_option(struct mount_options *options) { struct sockaddr_storage dummy; struct sockaddr *sap = (struct sockaddr *)&dummy; @@ -210,7 +207,7 @@ static int nfs_fix_mounthost_option(const sa_family_t family, if (!mounthost) return 1; - if (!nfs_name_to_address(mounthost, family, sap, &salen)) { + if (!nfs_name_to_address(mounthost, sap, &salen)) { nfs_error(_("%s: unable to determine mount server's address"), progname); return 0; @@ -232,7 +229,7 @@ static const char *nfs_lock_opttbl[] = { static int nfs_verify_lock_option(struct mount_options *options) { - if (po_rightmost(options, nfs_lock_opttbl) == 1) + if (po_rightmost(options, nfs_lock_opttbl) == 0) return 1; if (!start_statd()) { @@ -270,14 +267,14 @@ static int nfs_validate_options(struct nfsmount_info *mi) if (!nfs_parse_devname(mi->spec, &mi->hostname, NULL)) return 0; - if (!nfs_name_to_address(mi->hostname, mi->family, sap, &salen)) + if (!nfs_name_to_address(mi->hostname, sap, &salen)) return 0; if (strncmp(mi->type, "nfs4", 4) == 0) { if (!nfs_append_clientaddr_option(sap, salen, mi->options)) return 0; } else { - if (!nfs_fix_mounthost_option(mi->family, mi->options)) + if (!nfs_fix_mounthost_option(mi->options)) return 0; if (!mi->fake && !nfs_verify_lock_option(mi->options)) return 0; @@ -309,6 +306,38 @@ static int nfs_is_permanent_error(int error) } } +/* + * Get NFS/mnt server addresses from mount options + * + * Returns 1 and fills in @nfs_saddr, @nfs_salen, @mnt_saddr, and @mnt_salen + * if all goes well; otherwise zero. + */ +static int nfs_extract_server_addresses(struct mount_options *options, + struct sockaddr *nfs_saddr, + socklen_t *nfs_salen, + struct sockaddr *mnt_saddr, + socklen_t *mnt_salen) +{ + char *option; + + option = po_get(options, "addr"); + if (option == NULL) + return 0; + if (!nfs_string_to_sockaddr(option, strlen(option), + nfs_saddr, nfs_salen)) + return 0; + + option = po_get(options, "mountaddr"); + if (option == NULL) { + memcpy(mnt_saddr, nfs_saddr, *nfs_salen); + *mnt_salen = *nfs_salen; + } else if (!nfs_string_to_sockaddr(option, strlen(option), + mnt_saddr, mnt_salen)) + return 0; + + return 1; +} + static int nfs_construct_new_options(struct mount_options *options, struct pmap *nfs_pmap, struct pmap *mnt_pmap) @@ -400,9 +429,14 @@ static int nfs_construct_new_options(struct mount_options *options, static struct mount_options *nfs_rewrite_mount_options(char *str) { struct mount_options *options; - char *option; - clnt_addr_t mnt_server = { }; - clnt_addr_t nfs_server = { }; + struct sockaddr_storage nfs_address; + struct sockaddr *nfs_saddr = (struct sockaddr *)&nfs_address; + socklen_t nfs_salen; + struct pmap nfs_pmap; + struct sockaddr_storage mnt_address; + struct sockaddr *mnt_saddr = (struct sockaddr *)&mnt_address; + socklen_t mnt_salen; + struct pmap mnt_pmap; options = po_split(str); if (!options) { @@ -410,39 +444,27 @@ static struct mount_options *nfs_rewrite_mount_options(char *str) return NULL; } - errno = EINVAL; - option = po_get(options, "addr"); - if (option) { - nfs_server.saddr.sin_family = AF_INET; - if (!inet_aton((const char *)option, &nfs_server.saddr.sin_addr)) - goto err; - } else + if (!nfs_extract_server_addresses(options, nfs_saddr, &nfs_salen, + mnt_saddr, &mnt_salen)) { + errno = EINVAL; goto err; + } - option = po_get(options, "mountaddr"); - if (option) { - mnt_server.saddr.sin_family = AF_INET; - if (!inet_aton((const char *)option, &mnt_server.saddr.sin_addr)) - goto err; - } else - memcpy(&mnt_server.saddr, &nfs_server.saddr, - sizeof(mnt_server.saddr)); - - nfs_options2pmap(options, &nfs_server.pmap, &mnt_server.pmap); + nfs_options2pmap(options, &nfs_pmap, &mnt_pmap); /* The kernel NFS client doesn't support changing the RPC program * number for these services, so reset these fields before probing * the server's ports. */ - nfs_server.pmap.pm_prog = NFS_PROGRAM; - mnt_server.pmap.pm_prog = MOUNTPROG; + nfs_pmap.pm_prog = NFS_PROGRAM; + mnt_pmap.pm_prog = MOUNTPROG; - if (!probe_bothports(&mnt_server, &nfs_server)) { + if (!nfs_probe_bothports(mnt_saddr, mnt_salen, &mnt_pmap, + nfs_saddr, nfs_salen, &nfs_pmap)) { errno = ESPIPE; goto err; } - if (!nfs_construct_new_options(options, - &nfs_server.pmap, &mnt_server.pmap)) { + if (!nfs_construct_new_options(options, &nfs_pmap, &mnt_pmap)) { errno = EINVAL; goto err; } @@ -732,7 +754,7 @@ static int nfsmount_start(struct nfsmount_info *mi) if (!nfs_validate_options(mi)) return EX_FAIL; - if (po_rightmost(mi->options, nfs_background_opttbl) == 1) + if (po_rightmost(mi->options, nfs_background_opttbl) == 0) return nfsmount_bg(mi); else return nfsmount_fg(mi); @@ -760,11 +782,6 @@ int nfsmount_string(const char *spec, const char *node, const char *type, .flags = flags, .fake = fake, .child = child, -#ifdef IPV6_SUPPORTED - .family = AF_UNSPEC, /* either IPv4 or v6 */ -#else - .family = AF_INET, /* only IPv4 */ -#endif }; int retval = EX_FAIL;