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;
+       }
+
+       /* 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:
-- 
1.7.10.4

--
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

Reply via email to