On Sun, 14 Apr 2013 14:19:18 -0400 scott.lovenberg@xxxxxxxxx wrote: > From: Scott Lovenberg <scott.lovenberg@xxxxxxxxx> > > The standard for formatting IPv6 addresses is to enclose them in brackets. > This patch allows the mount helper to parse IPv6 addresses that are enclosed in brackets. > There is a slight change of behavior in this patch; specifying the --ip option without > supplying an address now exits the mount helper rather than just ignoring and continuing. > > Signed-off-by: Scott Lovenberg <scott.lovenberg@xxxxxxxxx> > --- > AUTHORS | 1 + > mount.cifs.c | 63 ++++++++++++++++++++++++++++++++++++++++++---------------- > 2 files changed, 47 insertions(+), 17 deletions(-) > > diff --git a/AUTHORS b/AUTHORS > index 2807079..081c2fe 100644 > --- a/AUTHORS > +++ b/AUTHORS > @@ -5,5 +5,6 @@ Shirish Pargaonkar <shirishpargaonkar@xxxxxxxxx> > Suresh Jayaraman <sjayaraman@xxxxxxx> > Pavel Shilovsky <piastry@xxxxxxxxxxx> > Igor Druzhinin <jaxbrigs@xxxxxxxxx> > +Scott Lovenberg <scott.lovenberg@xxxxxxxxx> > > ...and others. > diff --git a/mount.cifs.c b/mount.cifs.c > index 3b2b89e..276f50d 100644 > --- a/mount.cifs.c > +++ b/mount.cifs.c > @@ -751,6 +751,48 @@ static int parse_opt_token(const char *token) > return OPT_ERROR; > } > > +/* > + Extract an ipv4 or ipv6 address and put it into parsed_info. > + Returns 0 on success. > +*/ > +static int parse_ip(char *value, struct parsed_mount_info *parsed_info) > +{ > + char *closingBracket = NULL; > + > + if (!value || !*value) { > + fprintf(stderr, "target ip address argument missing\n"); > + return OPT_ERROR; I think you want something like EX_USAGE here. > + } > + > + /* check for ipv6 in brackets */ > + if (value[0] == '[') { > + value++; > + /* temporarily null the closing bracket */ > + closingBracket = strchr(value, ']'); > + if (closingBracket) > + *closingBracket = '\0'; > + } > + > + /* check length of address*/ > + if (strnlen(value, MAX_ADDRESS_LEN + 1) > MAX_ADDRESS_LEN) { > + fprintf(stderr, "ip address too long\n"); > + if (closingBracket) > + *closingBracket = ']'; > + return EX_USAGE; > + } > + > + /* all test pass, copy it */ > + strcpy(parsed_info->addrlist, value); > + if (parsed_info->verboseflag) > + fprintf(stderr, "ip address %s override specified\n", value); > + > + /* put back closing bracket */ > + if (closingBracket) > + *closingBracket = ']'; > + > + return 0; > +} > + > static int > parse_options(const char *data, struct parsed_mount_info *parsed_info) > { > @@ -861,23 +903,10 @@ parse_options(const char *data, struct parsed_mount_info *parsed_info) > break; > > case OPT_IP: > - if (!value || !*value) { > - fprintf(stderr, > - "target ip address argument missing\n"); > - } else if (strnlen(value, MAX_ADDRESS_LEN) <= > - MAX_ADDRESS_LEN) { > - strcpy(parsed_info->addrlist, value); > - if (parsed_info->verboseflag) > - fprintf(stderr, > - "ip address %s override specified\n", > - value); > - goto nocopy; > - } else { > - fprintf(stderr, "ip address too long\n"); > - return EX_USAGE; > - > - } > - break; > + rc = parse_ip(value, parsed_info); > + if (rc) > + return rc; > + goto nocopy; > > /* unc || target || path */ > case OPT_UNC: -- Jeff Layton <jlayton@xxxxxxxxx> -- To unsubscribe from this list: send the line "unsubscribe linux-cifs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html