X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=utils%2Fmount%2Fstropts.c;h=76bbefd3104eaf10f117461ae8e1f4fcfd0cd545;hb=3faa54e8a17411de28c7b707207d49b4466ae873;hp=8d168db23b9ce7497a0f470a41d8e035baa79c4c;hpb=23c1a452afce5726cfe661a4d7ac14a1883ecb55;p=nfs-utils.git diff --git a/utils/mount/stropts.c b/utils/mount/stropts.c index 8d168db..76bbefd 100644 --- a/utils/mount/stropts.c +++ b/utils/mount/stropts.c @@ -80,10 +80,13 @@ struct nfsmount_info { *node, /* mounted-on dir */ *type; /* "nfs" or "nfs4" */ char *hostname; /* server's hostname */ + struct sockaddr_storage address; /* server's address */ + socklen_t salen; /* size of server's address */ struct mount_options *options; /* parsed mount options */ char **extra_opts; /* string for /etc/mtab */ + unsigned long version; /* NFS version */ int flags, /* MS_ flags */ fake, /* actually do the mount? */ child; /* forked bg child? */ @@ -130,12 +133,14 @@ static int nfs_append_generic_address_option(const struct sockaddr *sap, { char address[NI_MAXHOST]; char new_option[512]; + int len; if (!nfs_present_sockaddr(sap, salen, address, sizeof(address))) goto out_err; - if (snprintf(new_option, sizeof(new_option), "%s=%s", - keyword, address) >= sizeof(new_option)) + len = snprintf(new_option, sizeof(new_option), "%s=%s", + keyword, address); + if (len < 0 || (size_t)len >= sizeof(new_option)) goto out_err; if (po_append(options, new_option) != PO_SUCCEEDED) @@ -260,18 +265,22 @@ static int nfs_append_sloppy_option(struct mount_options *options) */ static int nfs_validate_options(struct nfsmount_info *mi) { - struct sockaddr_storage dummy; - struct sockaddr *sap = (struct sockaddr *)&dummy; - socklen_t salen = sizeof(dummy); + struct sockaddr *sap = (struct sockaddr *)&mi->address; if (!nfs_parse_devname(mi->spec, &mi->hostname, NULL)) return 0; - if (!nfs_name_to_address(mi->hostname, sap, &salen)) + mi->salen = sizeof(mi->address); + if (!nfs_name_to_address(mi->hostname, sap, &mi->salen)) + return 0; + + if (!nfs_nfs_version(mi->options, &mi->version)) return 0; + if (strncmp(mi->type, "nfs4", 4) == 0) + mi->version = 4; - if (strncmp(mi->type, "nfs4", 4) == 0) { - if (!nfs_append_clientaddr_option(sap, salen, mi->options)) + if (mi->version == 4) { + if (!nfs_append_clientaddr_option(sap, mi->salen, mi->options)) return 0; } else { if (!nfs_fix_mounthost_option(mi->options)) @@ -283,7 +292,7 @@ static int nfs_validate_options(struct nfsmount_info *mi) if (!nfs_append_sloppy_option(mi->options)) return 0; - if (!nfs_append_addr_option(sap, salen, mi->options)) + if (!nfs_append_addr_option(sap, mi->salen, mi->options)) return 0; /* @@ -312,16 +321,14 @@ static int nfs_extract_server_addresses(struct mount_options *options, option = po_get(options, "addr"); if (option == NULL) return 0; - if (!nfs_string_to_sockaddr(option, strlen(option), - nfs_saddr, nfs_salen)) + if (!nfs_string_to_sockaddr(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)) + } else if (!nfs_string_to_sockaddr(option, mnt_saddr, mnt_salen)) return 0; return 1; @@ -420,11 +427,11 @@ nfs_rewrite_pmap_mount_options(struct mount_options *options) { struct sockaddr_storage nfs_address; struct sockaddr *nfs_saddr = (struct sockaddr *)&nfs_address; - socklen_t nfs_salen; + socklen_t nfs_salen = sizeof(nfs_address); struct pmap nfs_pmap; struct sockaddr_storage mnt_address; struct sockaddr *mnt_saddr = (struct sockaddr *)&mnt_address; - socklen_t mnt_salen; + socklen_t mnt_salen = sizeof(mnt_address); struct pmap mnt_pmap; char *option; @@ -488,7 +495,7 @@ static int nfs_try_mount(struct nfsmount_info *mi) char *options = NULL; int result; - if (strncmp(mi->type, "nfs4", 4) != 0) { + if (mi->version != 4) { if (!nfs_rewrite_pmap_mount_options(mi->options)) return 0; }