write_http plugin: Be extra conservative in wh_reset_buffer().
[collectd.git] / src / teamspeak2.c
index 5cd427a..40ca15e 100644 (file)
  *
  * Authors:
  *   Stefan Hacker <d0t at dbclan dot de>
- *   Florian Forster <octo at verplant.org>
+ *   Florian Forster <octo at collectd.org>
  **/
 
 #include "collectd.h"
+
 #include "common.h"
 #include "plugin.h"
 
-#include <arpa/inet.h>
 #include <netinet/in.h>
+#include <arpa/inet.h>
 #include <sys/types.h>
-#include <sys/socket.h>
 #include <netdb.h>
 
 /*
@@ -84,13 +84,12 @@ static int tss2_add_vserver (int vserver_port)
        }
 
        /* Allocate memory */
-       entry = (vserver_list_t *) malloc (sizeof (vserver_list_t));
+       entry = calloc (1, sizeof (*entry));
        if (entry == NULL)
        {
-               ERROR ("teamspeak2 plugin: malloc failed.");
+               ERROR ("teamspeak2 plugin: calloc failed.");
                return (-1);
        }
-       memset (entry, 0, sizeof (vserver_list_t));
 
        /* Save data */
        entry->port = vserver_port;
@@ -129,7 +128,6 @@ static void tss2_submit_gauge (const char *plugin_instance,
 
        vl.values     = values;
        vl.values_len = 1;
-       vl.time       = time (NULL);
        sstrncpy (vl.host, hostname_g, sizeof (vl.host));
        sstrncpy (vl.plugin, "teamspeak2", sizeof (vl.plugin));
 
@@ -142,12 +140,12 @@ static void tss2_submit_gauge (const char *plugin_instance,
        if (type_instance != NULL)
                sstrncpy (vl.type_instance, type_instance,
                                sizeof (vl.type_instance));
-       
+
        plugin_dispatch_values (&vl);
 } /* void tss2_submit_gauge */
 
 static void tss2_submit_io (const char *plugin_instance, const char *type,
-               counter_t rx, counter_t tx)
+               derive_t rx, derive_t tx)
 {
        /*
         * Submits the io rx/tx tuple to the collectd daemon
@@ -155,12 +153,11 @@ static void tss2_submit_io (const char *plugin_instance, const char *type,
        value_t values[2];
        value_list_t vl = VALUE_LIST_INIT;
 
-       values[0].counter = rx;
-       values[1].counter = tx;
+       values[0].derive = rx;
+       values[1].derive = tx;
 
        vl.values     = values;
        vl.values_len = 2;
-       vl.time       = time (NULL);
        sstrncpy (vl.host, hostname_g, sizeof (vl.host));
        sstrncpy (vl.plugin, "teamspeak2", sizeof (vl.plugin));
 
@@ -202,7 +199,6 @@ static int tss2_get_socket (FILE **ret_read_fh, FILE **ret_write_fh)
         * Returns connected file objects or establishes the connection
         * if it's not already present
         */
-       struct addrinfo ai_hints;
        struct addrinfo *ai_head;
        struct addrinfo *ai_ptr;
        int sd = -1;
@@ -220,12 +216,11 @@ static int tss2_get_socket (FILE **ret_read_fh, FILE **ret_write_fh)
        }
 
        /* Get all addrs for this hostname */
-       memset (&ai_hints, 0, sizeof (ai_hints));
-#ifdef AI_ADDRCONFIG
-       ai_hints.ai_flags |= AI_ADDRCONFIG;
-#endif
-       ai_hints.ai_family = AF_UNSPEC;
-       ai_hints.ai_socktype = SOCK_STREAM;
+       struct addrinfo ai_hints = {
+               .ai_family = AF_UNSPEC,
+               .ai_flags = AI_ADDRCONFIG,
+               .ai_socktype = SOCK_STREAM
+       };
 
        status = getaddrinfo ((config_host != NULL) ? config_host : DEFAULT_HOST,
                        (config_port != NULL) ? config_port : DEFAULT_PORT,
@@ -260,6 +255,7 @@ static int tss2_get_socket (FILE **ret_read_fh, FILE **ret_write_fh)
                        WARNING ("teamspeak2 plugin: connect failed: %s",
                                        sstrerror (errno, errbuf, sizeof (errbuf)));
                        close (sd);
+                       sd = -1;
                        continue;
                }
 
@@ -301,6 +297,13 @@ static int tss2_get_socket (FILE **ret_read_fh, FILE **ret_write_fh)
                char *buffer_ptr;
 
                buffer_ptr = fgets (buffer, sizeof (buffer), global_read_fh);
+               if (buffer_ptr == NULL)
+               {
+                       WARNING ("teamspeak2 plugin: Unexpected EOF received "
+                                       "from remote host %s:%s.",
+                                       config_host ? config_host : DEFAULT_HOST,
+                                       config_port ? config_port : DEFAULT_PORT);
+               }
                buffer[sizeof (buffer) - 1] = 0;
 
                if (memcmp ("[TS]\r\n", buffer, 6) != 0)
@@ -347,7 +350,7 @@ static int tss2_receive_line (FILE *fh, char *buffer, int buffer_size)
         * Receive a single line from the given file object
         */
        char *temp;
-        
+
        /*
         * fgets is blocking but much easier then doing anything else
         * TODO: Non-blocking Version would be safer
@@ -408,7 +411,7 @@ static int tss2_select_vserver (FILE *read_fh, FILE *write_fh, vserver_list_t *v
 } /* int tss2_select_vserver */
 
 static int tss2_vserver_gapl (FILE *read_fh, FILE *write_fh,
-               vserver_list_t *vserver, gauge_t *ret_value)
+               gauge_t *ret_value)
 {
        /*
         * Reads the vserver's average packet loss and submits it to collectd.
@@ -430,18 +433,18 @@ static int tss2_vserver_gapl (FILE *read_fh, FILE *write_fh,
                char buffer[4096];
                char *value;
                char *endptr = NULL;
-               
+
                status = tss2_receive_line (read_fh, buffer, sizeof (buffer));
                if (status != 0)
                {
-                       /* Set to NULL just to make sure noone uses these FHs anymore. */
+                       /* Set to NULL just to make sure no one uses these FHs anymore. */
                        read_fh = NULL;
                        write_fh = NULL;
                        ERROR ("teamspeak2 plugin: tss2_receive_line failed.");
                        return (-1);
                }
                buffer[sizeof (buffer) - 1] = 0;
-               
+
                if (strncmp ("average_packet_loss=", buffer,
                                        strlen ("average_packet_loss=")) == 0)
                {
@@ -457,9 +460,9 @@ static int tss2_vserver_gapl (FILE *read_fh, FILE *write_fh,
                                }
                                value++;
                        }
-                       
+
                        value = &buffer[20];
-                       
+
                        packet_loss = strtod (value, &endptr);
                        if (value == endptr)
                        {
@@ -484,7 +487,7 @@ static int tss2_vserver_gapl (FILE *read_fh, FILE *write_fh,
                                        buffer);
                }
        }
-       
+
        *ret_value = packet_loss;
        return (0);
 } /* int tss2_vserver_gapl */
@@ -500,14 +503,14 @@ static int tss2_read_vserver (vserver_list_t *vserver)
        gauge_t users = NAN;
        gauge_t channels = NAN;
        gauge_t servers = NAN;
-       counter_t rx_octets = 0;
-       counter_t tx_octets = 0;
-       counter_t rx_packets = 0;
-       counter_t tx_packets = 0;
+       derive_t rx_octets = 0;
+       derive_t tx_octets = 0;
+       derive_t rx_packets = 0;
+       derive_t tx_packets = 0;
        gauge_t packet_loss = NAN;
        int valid = 0;
 
-       char plugin_instance[DATA_MAX_NAME_LEN];
+       char plugin_instance[DATA_MAX_NAME_LEN] = { 0 };
 
        FILE *read_fh;
        FILE *write_fh;
@@ -523,8 +526,6 @@ static int tss2_read_vserver (vserver_list_t *vserver)
        if (vserver == NULL)
        {
                /* Request global information */
-               memset (plugin_instance, 0, sizeof (plugin_instance));
-
                status = tss2_send_request (write_fh, "gi\r\n");
        }
        else
@@ -554,12 +555,12 @@ static int tss2_read_vserver (vserver_list_t *vserver)
                char *key;
                char *value;
                char *endptr = NULL;
-               
+
                /* Read one line of the server's answer */
                status = tss2_receive_line (read_fh, buffer, sizeof (buffer));
                if (status != 0)
                {
-                       /* Set to NULL just to make sure noone uses these FHs anymore. */
+                       /* Set to NULL just to make sure no one uses these FHs anymore. */
                        read_fh = NULL;
                        write_fh = NULL;
                        ERROR ("teamspeak2 plugin: tss2_receive_line failed.");
@@ -679,7 +680,7 @@ static int tss2_read_vserver (vserver_list_t *vserver)
         * with an error. */
        if ((status == 0) && (vserver != NULL))
        {
-               status = tss2_vserver_gapl (read_fh, write_fh, vserver, &packet_loss);
+               status = tss2_vserver_gapl (read_fh, write_fh, &packet_loss);
                if (status == 0)
                {
                        valid |= 0x20;
@@ -719,7 +720,7 @@ static int tss2_config (const char *key, const char *value)
        /*
         * Interpret configuration values
         */
-    if (strcasecmp ("Host", key) == 0)
+       if (strcasecmp ("Host", key) == 0)
        {
                char *temp;
 
@@ -749,7 +750,7 @@ static int tss2_config (const char *key, const char *value)
        {
                /* Server variable found */
                int status;
-               
+
                status = tss2_add_vserver (atoi (value));
                if (status != 0)
                        return (1);
@@ -799,10 +800,10 @@ static int tss2_read (void)
                        continue;
                }
        }
-       
+
        if (success == 0)
                return (-1);
-    return (0);
+       return (0);
 } /* int tss2_read */
 
 static int tss2_shutdown(void)
@@ -828,7 +829,7 @@ static int tss2_shutdown(void)
        /* Get rid of the configuration */
        sfree (config_host);
        sfree (config_port);
-       
+
     return (0);
 } /* int tss2_shutdown */