Message ID | 1365963558-20082-1-git-send-email-scott.lovenberg@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Sun, Apr 14, 2013 at 2:19 PM, <scott.lovenberg@gmail.com> wrote: > From: Scott Lovenberg <scott.lovenberg@gmail.com> > > 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@gmail.com> I should mention, this hasn't actually been tested. Only compiled. A patch this small is usually fairly safe.. then again, I've messed up one-liners. A few eyes over this code would be appreciated. -- Peace and Blessings, -Scott. -- To unsubscribe from this list: send the line "unsubscribe linux-cifs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Sun, 14 Apr 2013 14:19:18 -0400 scott.lovenberg@gmail.com wrote: > From: Scott Lovenberg <scott.lovenberg@gmail.com> > > 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@gmail.com> > --- > 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@gmail.com> > Suresh Jayaraman <sjayaraman@suse.de> > Pavel Shilovsky <piastry@etersoft.ru> > Igor Druzhinin <jaxbrigs@gmail.com> > +Scott Lovenberg <scott.lovenberg@gmail.com> > > ...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:
diff --git a/AUTHORS b/AUTHORS index 2807079..081c2fe 100644 --- a/AUTHORS +++ b/AUTHORS @@ -5,5 +5,6 @@ Shirish Pargaonkar <shirishpargaonkar@gmail.com> Suresh Jayaraman <sjayaraman@suse.de> Pavel Shilovsky <piastry@etersoft.ru> Igor Druzhinin <jaxbrigs@gmail.com> +Scott Lovenberg <scott.lovenberg@gmail.com> ...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; + } + + /* 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: