From: Franck Lombardi (no email) Date: Thu, 16 Apr 2009 15:18:44 +0000 (+0200) Subject: memcache plugin: Make connecting via UNIX socket possible. X-Git-Tag: collectd-4.7.0~53^2~4 X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=e34a1b3f577981b06056e74edd809ac055d8d1d3;p=collectd.git memcache plugin: Make connecting via UNIX socket possible. Hello, As the bugtracker is broken, I'm sending you this patch against v4.6.2 It was done by one of my collegues (Franck Lombardi) As Franck doesn't want his email address to go in the wild, I proposed to send it for him. It adds a new configuration option "Socket" for this pluggin i'll try to upload my patch there once Mantis is back to normal Cheers Stéphane Loeuillet Seulement dans collectd-4.6.2-fl/bindings: .perl-directory-stamp Seulement dans collectd-4.6.2/src/libcollectdclient: lcc_features.h Signed-off-by: Florian Forster --- diff --git a/src/memcached.c b/src/memcached.c index b5a4b208..bef97001 100644 --- a/src/memcached.c +++ b/src/memcached.c @@ -31,6 +31,7 @@ # include # include # include +# include # include # include @@ -41,11 +42,13 @@ static const char *config_keys[] = { + "Socket", "Host", "Port" }; static int config_keys_num = STATIC_ARRAY_SIZE (config_keys); +static char *memcached_socket = NULL; static char *memcached_host = NULL; static char memcached_port[16]; @@ -54,66 +57,92 @@ static int memcached_query_daemon (char *buffer, int buffer_size) /* {{{ */ int fd; ssize_t status; int buffer_fill; - - const char *host; - const char *port; - - struct addrinfo ai_hints; - struct addrinfo *ai_list, *ai_ptr; - int ai_return, i = 0; - - memset (&ai_hints, '\0', sizeof (ai_hints)); - ai_hints.ai_flags = 0; + int i = 0; + + if (memcached_socket != NULL) { + + struct sockaddr_un serv_addr; + + memset(&serv_addr, '\0', sizeof (serv_addr)); + serv_addr.sun_family = AF_UNIX; + strncpy(serv_addr.sun_path, memcached_socket, sizeof (serv_addr.sun_path)); + + /* create our socket descriptor */ + if ((fd = socket (AF_UNIX, SOCK_STREAM, 0)) < 0) { + char errbuf[1024]; + ERROR ("memcached: unix socket: %s", sstrerror (errno, errbuf, sizeof (errbuf))); + return -1; + } + + /* connect to the memcached daemon */ + if (connect (fd, (struct sockaddr *) &serv_addr, SUN_LEN(&serv_addr))) { + shutdown(fd, SHUT_RDWR); + close(fd); + fd = -1; + } + + } else { + + const char *host; + const char *port; + + struct addrinfo ai_hints; + struct addrinfo *ai_list, *ai_ptr; + int ai_return = 0; + + memset (&ai_hints, '\0', sizeof (ai_hints)); + ai_hints.ai_flags = 0; #ifdef AI_ADDRCONFIG -/* ai_hints.ai_flags |= AI_ADDRCONFIG; */ + /* ai_hints.ai_flags |= AI_ADDRCONFIG; */ #endif - ai_hints.ai_family = AF_INET; - ai_hints.ai_socktype = SOCK_STREAM; - ai_hints.ai_protocol = 0; - - host = memcached_host; - if (host == NULL) { - host = MEMCACHED_DEF_HOST; - } - - port = memcached_port; - if (strlen (port) == 0) { - port = MEMCACHED_DEF_PORT; - } - - if ((ai_return = getaddrinfo (host, port, NULL, &ai_list)) != 0) { - char errbuf[1024]; - ERROR ("memcached: getaddrinfo (%s, %s): %s", - host, port, - (ai_return == EAI_SYSTEM) - ? sstrerror (errno, errbuf, sizeof (errbuf)) - : gai_strerror (ai_return)); - return -1; - } - - fd = -1; - for (ai_ptr = ai_list; ai_ptr != NULL; ai_ptr = ai_ptr->ai_next) { - /* create our socket descriptor */ - if ((fd = socket (ai_ptr->ai_family, ai_ptr->ai_socktype, ai_ptr->ai_protocol)) < 0) { - char errbuf[1024]; - ERROR ("memcached: socket: %s", sstrerror (errno, errbuf, sizeof (errbuf))); - continue; - } - - /* connect to the memcached daemon */ - if (connect (fd, (struct sockaddr *) ai_ptr->ai_addr, ai_ptr->ai_addrlen)) { - shutdown(fd, SHUT_RDWR); - close(fd); - fd = -1; - continue; - } - - /* A socket could be opened and connecting succeeded. We're - * done. */ - break; - } - - freeaddrinfo (ai_list); + ai_hints.ai_family = AF_INET; + ai_hints.ai_socktype = SOCK_STREAM; + ai_hints.ai_protocol = 0; + + host = memcached_host; + if (host == NULL) { + host = MEMCACHED_DEF_HOST; + } + + port = memcached_port; + if (strlen (port) == 0) { + port = MEMCACHED_DEF_PORT; + } + + if ((ai_return = getaddrinfo (host, port, NULL, &ai_list)) != 0) { + char errbuf[1024]; + ERROR ("memcached: getaddrinfo (%s, %s): %s", + host, port, + (ai_return == EAI_SYSTEM) + ? sstrerror (errno, errbuf, sizeof (errbuf)) + : gai_strerror (ai_return)); + return -1; + } + + fd = -1; + for (ai_ptr = ai_list; ai_ptr != NULL; ai_ptr = ai_ptr->ai_next) { + /* create our socket descriptor */ + if ((fd = socket (ai_ptr->ai_family, ai_ptr->ai_socktype, ai_ptr->ai_protocol)) < 0) { + char errbuf[1024]; + ERROR ("memcached: socket: %s", sstrerror (errno, errbuf, sizeof (errbuf))); + continue; + } + + /* connect to the memcached daemon */ + if (connect (fd, (struct sockaddr *) ai_ptr->ai_addr, ai_ptr->ai_addrlen)) { + shutdown(fd, SHUT_RDWR); + close(fd); + fd = -1; + continue; + } + + /* A socket could be opened and connecting succeeded. We're + * done. */ + break; + } + + freeaddrinfo (ai_list); + } if (fd < 0) { ERROR ("memcached: Could not connect to daemon."); @@ -204,7 +233,12 @@ static int memcached_query_daemon (char *buffer, int buffer_size) /* {{{ */ static int memcached_config (const char *key, const char *value) /* {{{ */ { - if (strcasecmp (key, "Host") == 0) { + if (strcasecmp (key, "Socket") == 0) { + if (memcached_socket != NULL) { + free (memcached_socket); + } + memcached_socket = strdup (value); + } else if (strcasecmp (key, "Host") == 0) { if (memcached_host != NULL) { free (memcached_host); }