On Sun, 14 Apr 2013 14:19:18 -0400
[email protected] wrote:
> From: Scott Lovenberg <[email protected]>
>
> 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 <[email protected]>
> ---
> 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 <[email protected]>
> Suresh Jayaraman <[email protected]>
> Pavel Shilovsky <[email protected]>
> Igor Druzhinin <[email protected]>
> +Scott Lovenberg <[email protected]>
>
> ...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 <[email protected]>
--
To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html