X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fmemcached.c;h=765a0fd3bcd501294abd2e23b02eb6a22365c34f;hb=c76419c0cf983f1ecd3d36aa236cc4e3f9cff733;hp=bd83b46eeb26782ea8983cb485e2f233ddba42a9;hpb=ec43e8a33bdcb116e75310c7bd9daae3bc912834;p=collectd.git diff --git a/src/memcached.c b/src/memcached.c index bd83b46e..765a0fd3 100644 --- a/src/memcached.c +++ b/src/memcached.c @@ -44,9 +44,10 @@ struct memcached_s { char *name; - char *socket; char *host; - char *port; + char *socket; + char *connhost; + char *connport; }; typedef struct memcached_s memcached_t; @@ -59,9 +60,10 @@ static void memcached_free (void *arg) return; sfree (st->name); - sfree (st->socket); sfree (st->host); - sfree (st->port); + sfree (st->socket); + sfree (st->connhost); + sfree (st->connport); sfree (st); } @@ -98,29 +100,23 @@ static int memcached_connect_unix (memcached_t *st) static int memcached_connect_inet (memcached_t *st) { - const char *host; - const char *port; - struct addrinfo *ai_list; int status; int fd = -1; - host = (st->host != NULL) ? st->host : MEMCACHED_DEF_HOST; - port = (st->port != NULL) ? st->port : MEMCACHED_DEF_PORT; - struct addrinfo ai_hints = { .ai_family = AF_UNSPEC, .ai_flags = AI_ADDRCONFIG, .ai_socktype = SOCK_STREAM }; - status = getaddrinfo (host, port, &ai_hints, &ai_list); + status = getaddrinfo (st->connhost, st->connport, &ai_hints, &ai_list); if (status != 0) { char errbuf[1024]; ERROR ("memcached plugin: memcached_connect_inet: " "getaddrinfo(%s,%s) failed: %s", - host, port, + st->connhost, st->connport, (status == EAI_SYSTEM) ? sstrerror (errno, errbuf, sizeof (errbuf)) : gai_strerror (status)); @@ -239,22 +235,10 @@ static int memcached_query_daemon (char *buffer, size_t buffer_size, memcached_t static void memcached_init_vl (value_list_t *vl, memcached_t const *st) { - char const *host = st->host; - - /* Keep default hostname, if: - * - Legacy mode is used. - * - "Socket" option is given (doc: "Host option is ignored"). - * - "Host" option is not provided. - * - "Host" option is set to "localhost" or "127.0.0.1". */ - if ((strcmp (st->name, "__legacy__") != 0) - && (st->socket == NULL) - && (st->host != NULL) - && (strcmp ("127.0.0.1", st->host) != 0) - && (strcmp ("localhost", st->host) != 0)) - sstrncpy (vl->host, host, sizeof (vl->host)); - sstrncpy (vl->plugin, "memcached", sizeof (vl->plugin)); - if (strcmp (st->name, "__legacy__") != 0) + if (st->host != NULL) + sstrncpy (vl->host, st->host, sizeof (vl->host)); + if (st->name != NULL) sstrncpy (vl->plugin_instance, st->name, sizeof (vl->plugin_instance)); } @@ -544,8 +528,49 @@ static int memcached_add_read_callback (memcached_t *st) char callback_name[3*DATA_MAX_NAME_LEN]; int status; - assert (st->name != NULL); - ssnprintf (callback_name, sizeof (callback_name), "memcached/%s", st->name); + ssnprintf (callback_name, sizeof (callback_name), "memcached/%s", + (st->name != NULL) ? st->name : "__legacy__"); + + /* If no
used then: + * - Connect to the destination specified by , if present. + * If not, use the default address. + * - Use the default hostname (set st->host to NULL), if + * - Legacy mode is used (no configuration options at all), or + * - "Host" option is not provided, or + * - "Host" option is set to "localhost" or "127.0.0.1". + * + * If
used then host may be set to "localhost" or "127.0.0.1" + * explicitly. + */ + if (st->connhost == NULL) + { + if (st->host) + { + st->connhost = strdup(st->host); + if (st->connhost == NULL) + return (ENOMEM); + + if ((strcmp ("127.0.0.1", st->host) == 0) + || (strcmp ("localhost", st->host) == 0)) + sfree(st->host); + } + else + { + st->connhost = strdup(MEMCACHED_DEF_HOST); + if (st->connhost == NULL) + return (ENOMEM); + } + } + + if (st->connport == NULL) + { + st->connport = strdup(MEMCACHED_DEF_PORT); + if (st->connport == NULL) + return (ENOMEM); + } + + assert (st->connhost != NULL); + assert (st->connport != NULL); status = plugin_register_complex_read (/* group = */ "memcached", /* name = */ callback_name, @@ -563,6 +588,7 @@ static int memcached_add_read_callback (memcached_t *st) * * * Host foo.zomg.com + * Address 1.2.3.4 * Port "1234" * * @@ -579,24 +605,23 @@ static int config_add_instance(oconfig_item_t *ci) if (st == NULL) { ERROR ("memcached plugin: calloc failed."); - return (-1); + return (ENOMEM); } st->name = NULL; - st->socket = NULL; st->host = NULL; - st->port = NULL; + st->socket = NULL; + st->connhost = NULL; + st->connport = NULL; - if (strcasecmp (ci->key, "Plugin") == 0) /* default instance */ - st->name = sstrdup ("__legacy__"); - else /* block */ + if (strcasecmp (ci->key, "Instance") == 0) status = cf_util_get_string (ci, &st->name); + if (status != 0) { sfree (st); return (status); } - assert (st->name != NULL); for (int i = 0; i < ci->children_num; i++) { @@ -606,8 +631,10 @@ static int config_add_instance(oconfig_item_t *ci) status = cf_util_get_string (child, &st->socket); else if (strcasecmp ("Host", child->key) == 0) status = cf_util_get_string (child, &st->host); + else if (strcasecmp ("Address", child->key) == 0) + status = cf_util_get_string (child, &st->connhost); else if (strcasecmp ("Port", child->key) == 0) - status = cf_util_get_service (child, &st->port); + status = cf_util_get_service (child, &st->connport); else { WARNING ("memcached plugin: Option `%s' not allowed here.", @@ -674,10 +701,11 @@ static int memcached_init (void) st = calloc (1, sizeof (*st)); if (st == NULL) return (ENOMEM); - st->name = sstrdup ("__legacy__"); - st->socket = NULL; + st->name = NULL; st->host = NULL; - st->port = NULL; + st->socket = NULL; + st->connhost = NULL; + st->connport = NULL; status = memcached_add_read_callback (st); if (status == 0)