X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Flibmemcached%2Fparse.cc;h=5fe34ba8311b8ba04554d1a480f8920ad95fcb39;hb=e4dc06e9f89a6aa678e2973898ae75faa80bc0c2;hp=373804654f1de31c08e641853bf0f636730dd07c;hpb=c8a5aecba8e189092266f304ca81ab42625edf60;p=m6w6%2Flibmemcached diff --git a/src/libmemcached/parse.cc b/src/libmemcached/parse.cc index 37380465..5fe34ba8 100644 --- a/src/libmemcached/parse.cc +++ b/src/libmemcached/parse.cc @@ -9,7 +9,7 @@ | the terms online at: https://opensource.org/licenses/BSD-3-Clause | +--------------------------------------------------------------------+ | Copyright (c) 2006-2014 Brian Aker https://datadifferential.com/ | - | Copyright (c) 2020 Michael Wallner | + | Copyright (c) 2020-2021 Michael Wallner https://awesome.co/ | +--------------------------------------------------------------------+ */ @@ -26,11 +26,11 @@ memcached_server_list_st memcached_servers_parse(const char *server_strings) { end_ptr = server_strings + strlen(server_strings); - for (begin_ptr = server_strings, string = (char *) index(server_strings, ','); - begin_ptr != end_ptr; string = (char *) index(begin_ptr, ',')) + for (begin_ptr = server_strings, string = (char *) strchr(server_strings, ','); + begin_ptr != end_ptr; string = (char *) strchr(begin_ptr, ',')) { char buffer[HUGE_STRING_LEN]; - char *ptr, *ptr2; + char *ptr, *ptr2 = NULL; uint32_t weight = 0; if (string) { @@ -44,8 +44,17 @@ memcached_server_list_st memcached_servers_parse(const char *server_strings) { begin_ptr = end_ptr; } - ptr = index(buffer, ':'); - + ptr = strchr(buffer, '['); + if (ptr) { + ptr2 = strchr(ptr+1, ']'); + } + if (ptr && ptr2) { + // [IPv6]:port + ptr = strchr(ptr2+1, ':'); + } else { + // IPv4:port or name:port + ptr = strchr(buffer, ':'); + } in_port_t port = 0; if (ptr) { ptr[0] = 0; @@ -54,20 +63,20 @@ memcached_server_list_st memcached_servers_parse(const char *server_strings) { errno = 0; port = (in_port_t) strtoul(ptr, (char **) NULL, 10); - if (errno != 0) { + if (errno) { memcached_server_free(servers); return NULL; } - ptr2 = index(ptr, ' '); + ptr2 = strchr(ptr, ' '); if (!ptr2) - ptr2 = index(ptr, ':'); + ptr2 = strchr(ptr, ':'); if (ptr2) { ptr2++; errno = 0; weight = uint32_t(strtoul(ptr2, (char **) NULL, 10)); - if (errno != 0) { + if (errno) { memcached_server_free(servers); return NULL; }