lib: database URL supports IPv6 address as hostname
authorAlexey Vasilyev <alexei.vasilyev@gmail.com>
Tue, 3 Sep 2019 13:48:02 +0000 (16:48 +0300)
committerHenning Westerholt <hw@skalatan.de>
Mon, 9 Sep 2019 19:51:59 +0000 (21:51 +0200)
- changed parsing of db_url to accept IPv6 address for hostname

src/lib/srdb1/db_id.c

index 35bf228..74788ff 100644 (file)
@@ -102,12 +102,13 @@ static int parse_db_url(struct db_id* id, const str* url)
                ST_USER_HOST,  /* Username or hostname */
                ST_PASS_PORT,  /* Password or port part */
                ST_HOST,       /* Hostname part */
+               ST_HOST6,      /* Hostname part IPv6 */
                ST_PORT,       /* Port part */
                ST_DB          /* Database part */
        };
 
        enum state st;
-       unsigned int len, i, j, a, foundanother;
+       unsigned int len, i, j, a, foundanother, ipv6_flag=0;
        const char* begin;
        char* prev_token;
 
@@ -190,6 +191,11 @@ static int parse_db_url(struct db_id* id, const str* url)
                                begin = url->s + i + 1;
                                break;
 
+                       case '[':
+                               st = ST_HOST6;
+                               begin = url->s + i + 1;
+                               break;
+
                        case '/':
                                if (dupl_string(&id->host, begin, url->s + i) < 0) goto err;
                                if (dupl_string_name(&id->database, url->s + i + 1, url->s + len) < 0) goto err;
@@ -226,19 +232,33 @@ static int parse_db_url(struct db_id* id, const str* url)
 
                case ST_HOST:
                        switch(url->s[i]) {
+                       case '[':
+                               st = ST_HOST6;
+                               begin = url->s + i + 1;
+                               break;
+
                        case ':':
                                st = ST_PORT;
-                               if (dupl_string(&id->host, begin, url->s + i) < 0) goto err;
+                               if (dupl_string(&id->host, begin, url->s + i - ipv6_flag) < 0) goto err;
                                begin = url->s + i + 1;
                                break;
 
                        case '/':
-                               if (dupl_string(&id->host, begin, url->s + i) < 0) goto err;
+                               if (dupl_string(&id->host, begin, url->s + i - ipv6_flag) < 0) goto err;
                                if (dupl_string_name(&id->database, url->s + i + 1, url->s + len) < 0) goto err;
                                return 0;
                        }
                        break;
 
+               case ST_HOST6:
+                       switch(url->s[i]) {
+                       case ']':
+                               ipv6_flag = 1;
+                               st = ST_HOST;
+                               break;
+                       }
+                       break;
+
                case ST_PORT:
                        switch(url->s[i]) {
                        case '/':