X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Flibmemcached%2Fconnect.cc;h=b71db7179d78a6647eff51afa6f52dd8f6b8a09e;hb=3301b2f6fc5a53b428d29b788ba85fe4dae7b12d;hp=e6db6fd64da5271376b47a4c0d5581450f98041a;hpb=46bddd219732926aae6734a1962c3899b9946ffb;p=awesomized%2Flibmemcached diff --git a/src/libmemcached/connect.cc b/src/libmemcached/connect.cc index e6db6fd6..b71db717 100644 --- a/src/libmemcached/connect.cc +++ b/src/libmemcached/connect.cc @@ -1,6 +1,6 @@ /* +--------------------------------------------------------------------+ - | libmemcached - C/C++ Client Library for memcached | + | libmemcached-awesome - C/C++ Client Library for memcached | +--------------------------------------------------------------------+ | Redistribution and use in source and binary forms, with or without | | modification, are permitted under the terms of the BSD license. | @@ -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/ | +--------------------------------------------------------------------+ */ @@ -18,50 +18,44 @@ #include - static memcached_return_t set_hostinfo(memcached_instance_st *server) { assert(server->type != MEMCACHED_CONNECTION_UNIX_SOCKET); + assert(server->hostname()); + server->clear_addrinfo(); - char str_port[MEMCACHED_NI_MAXSERV] = {0}; + char str_host[MEMCACHED_NI_MAXHOST] = {0}, str_port[MEMCACHED_NI_MAXSERV] = {0}; errno = 0; - int length = snprintf(str_port, MEMCACHED_NI_MAXSERV, "%u", uint32_t(server->port())); - if (length >= MEMCACHED_NI_MAXSERV or length <= 0 or errno) { + + auto length = snprintf(str_port, MEMCACHED_NI_MAXSERV, "%u", uint32_t(server->port())); + if (length <= 0 or errno) { return memcached_set_error(*server, MEMCACHED_MEMORY_ALLOCATION_FAILURE, MEMCACHED_AT, memcached_literal_param("snprintf(NI_MAXSERV)")); } - struct addrinfo hints; - memset(&hints, 0, sizeof(struct addrinfo)); - + struct addrinfo hints{}; hints.ai_family = AF_UNSPEC; if (memcached_is_udp(server->root)) { hints.ai_protocol = IPPROTO_UDP; hints.ai_socktype = SOCK_DGRAM; } else { - hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; + hints.ai_socktype = SOCK_STREAM; } - assert(server->address_info == NULL); - assert(server->address_info_next == NULL); - int errcode; - char hostname[MEMCACHED_NI_MAXHOST]; - const char *addr; - char *p; - - assert(server->hostname()); - // drop [] from address, commonly used for IPv6 - addr = server->hostname(); - if (*addr == '[') { - strcpy(hostname, addr +1); - p = strchr(hostname, ']'); - if (p) { - *p = 0; - addr = hostname; - } + auto hostname = server->hostname(); + if (*hostname == '[') { + auto closing_bracket = &hostname[strlen(hostname) - 1]; + if (*closing_bracket == ']') { + auto host_len = closing_bracket - hostname - 1; + if (host_len < MEMCACHED_NI_MAXHOST) { + hostname = strncpy(str_host, hostname + 1, host_len); + } + } } - switch (errcode = getaddrinfo(addr, str_port, &hints, &server->address_info)) { + + auto errcode = getaddrinfo(hostname, str_port, &hints, &server->address_info); + switch (errcode) { case 0: server->address_info_next = server->address_info; server->state = MEMCACHED_SERVER_STATE_ADDRINFO;