configure.in: Check for `mysql_get_server_version' in libmyql.
[collectd.git] / src / memcached.c
index ca93102..23054aa 100644 (file)
@@ -1,7 +1,8 @@
 /**
  * collectd - src/memcached.c, based on src/hddtemp.c
- * Copyright (C) 2007  Antony Dovgal
- * Copyright (C) 2005,2006  Vincent StehlĂ©
+ * Copyright (C) 2007       Antony Dovgal
+ * Copyright (C) 2007-2009  Florian Forster
+ * Copyright (C) 2009       Doug MacEachern
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the
@@ -19,8 +20,8 @@
  *
  * Authors:
  *   Antony Dovgal <tony at daylessday dot org>
- *   Vincent StehlĂ© <vincent.stehle at free.fr>
  *   Florian octo Forster <octo at verplant.org>
+ *   Doug MacEachern <dougm at hyperic.com>
  **/
 
 #include "collectd.h"
@@ -127,17 +128,29 @@ static int memcached_query_daemon (char *buffer, int buffer_size) /* {{{ */
 
        {
                struct pollfd p;
-               int n;
+               int status;
 
+               memset (&p, 0, sizeof (p));
                p.fd = fd;
-               p.events = POLLIN|POLLERR|POLLHUP;
+               p.events = POLLIN | POLLERR | POLLHUP;
                p.revents = 0;
 
-               n = poll(&p, 1, 3);
-
-               if (n <= 0) {
-                       ERROR ("memcached: poll() failed or timed out");
-                       return -1;
+               status = poll (&p, /* nfds = */ 1, /* timeout = */ 1000 * interval_g);
+               if (status <= 0)
+               {
+                       if (status == 0)
+                       {
+                               ERROR ("memcached: poll(2) timed out after %i seconds.", interval_g);
+                       }
+                       else
+                       {
+                               char errbuf[1024];
+                               ERROR ("memcached: poll(2) failed: %s",
+                                               sstrerror (errno, errbuf, sizeof (errbuf)));
+                       }
+                       shutdown (fd, SHUT_RDWR);
+                       close (fd);
+                       return (-1);
                }
        }
 
@@ -223,8 +236,8 @@ static void submit_counter (const char *type, const char *type_inst,
        vl.values = values;
        vl.values_len = 1;
        vl.time = time (NULL);
-       strcpy (vl.host, hostname_g);
-       strcpy (vl.plugin, "memcached");
+       sstrncpy (vl.host, hostname_g, sizeof (vl.host));
+       sstrncpy (vl.plugin, "memcached", sizeof (vl.plugin));
        sstrncpy (vl.type, type, sizeof (vl.type));
        if (type_inst != NULL)
                sstrncpy (vl.type_instance, type_inst, sizeof (vl.type_instance));
@@ -245,8 +258,8 @@ static void submit_counter2 (const char *type, const char *type_inst,
        vl.values = values;
        vl.values_len = 2;
        vl.time = time (NULL);
-       strcpy (vl.host, hostname_g);
-       strcpy (vl.plugin, "memcached");
+       sstrncpy (vl.host, hostname_g, sizeof (vl.host));
+       sstrncpy (vl.plugin, "memcached", sizeof (vl.plugin));
        sstrncpy (vl.type, type, sizeof (vl.type));
        if (type_inst != NULL)
                sstrncpy (vl.type_instance, type_inst, sizeof (vl.type_instance));
@@ -266,8 +279,8 @@ static void submit_gauge (const char *type, const char *type_inst,
        vl.values = values;
        vl.values_len = 1;
        vl.time = time (NULL);
-       strcpy (vl.host, hostname_g);
-       strcpy (vl.plugin, "memcached");
+       sstrncpy (vl.host, hostname_g, sizeof (vl.host));
+       sstrncpy (vl.plugin, "memcached", sizeof (vl.plugin));
        sstrncpy (vl.type, type, sizeof (vl.type));
        if (type_inst != NULL)
                sstrncpy (vl.type_instance, type_inst, sizeof (vl.type_instance));
@@ -288,8 +301,8 @@ static void submit_gauge2 (const char *type, const char *type_inst,
        vl.values = values;
        vl.values_len = 2;
        vl.time = time (NULL);
-       strcpy (vl.host, hostname_g);
-       strcpy (vl.plugin, "memcached");
+       sstrncpy (vl.host, hostname_g, sizeof (vl.host));
+       sstrncpy (vl.plugin, "memcached", sizeof (vl.plugin));
        sstrncpy (vl.type, type, sizeof (vl.type));
        if (type_inst != NULL)
                sstrncpy (vl.type_instance, type_inst, sizeof (vl.type_instance));