Merge branch 'collectd-5.5'
authorFlorian Forster <octo@collectd.org>
Sat, 5 Dec 2015 22:08:22 +0000 (23:08 +0100)
committerFlorian Forster <octo@collectd.org>
Sat, 5 Dec 2015 22:08:22 +0000 (23:08 +0100)
1  2 
src/daemon/common.c
src/iptables.c
src/libcollectdclient/network.c

diff --combined src/daemon/common.c
@@@ -46,6 -46,7 +46,6 @@@
  
  /* for getaddrinfo */
  #include <sys/types.h>
 -#include <sys/socket.h>
  #include <netdb.h>
  
  #include <poll.h>
@@@ -258,8 -259,8 +258,8 @@@ ssize_t sread (int fd, void *buf, size_
  
                assert ((0 > status) || (nleft >= (size_t)status));
  
 -              nleft = nleft - status;
 -              ptr   = ptr   + status;
 +              nleft = nleft - ((size_t) status);
 +              ptr   = ptr   + ((size_t) status);
        }
  
        return (0);
@@@ -299,8 -300,8 +299,8 @@@ ssize_t swrite (int fd, const void *buf
                if (status < 0)
                        return (status);
  
 -              nleft = nleft - status;
 -              ptr   = ptr   + status;
 +              nleft = nleft - ((size_t) status);
 +              ptr   = ptr   + ((size_t) status);
        }
  
        return (0);
@@@ -371,7 -372,7 +371,7 @@@ int strjoin (char *buffer, size_t buffe
        }
  
        assert (buffer[buffer_size - 1] == 0);
 -      return (strlen (buffer));
 +      return ((int) strlen (buffer));
  }
  
  int strsubstitute (char *str, char c_from, char c_to)
@@@ -506,8 -507,8 +506,8 @@@ size_t strstripnewline (char *buffer
  
  int escape_slashes (char *buffer, size_t buffer_size)
  {
 -      int i;
        size_t buffer_len;
 +      size_t i;
  
        buffer_len = strlen (buffer);
  
@@@ -680,8 -681,8 +680,8 @@@ int check_create_dir (const char *file_
                 * Join the components together again
                 */
                dir[0] = '/';
 -              if (strjoin (dir + path_is_absolute, dir_len - path_is_absolute,
 -                                      fields, i + 1, "/") < 0)
 +              if (strjoin (dir + path_is_absolute, (size_t) (dir_len - path_is_absolute),
 +                                      fields, (size_t) (i + 1), "/") < 0)
                {
                        ERROR ("strjoin failed: `%s', component #%i", file_orig, i);
                        return (-1);
@@@ -961,7 -962,7 +961,7 @@@ int format_values (char *ret, size_t re
  {
          size_t offset = 0;
          int status;
 -        int i;
 +        size_t i;
          gauge_t *rates = NULL;
  
          assert (0 == strcmp (ds->type, vl->type));
@@@ -1164,15 -1165,17 +1164,18 @@@ int parse_value (const char *value_orig
  
  int parse_values (char *buffer, value_list_t *vl, const data_set_t *ds)
  {
 -      int i;
 +      size_t i;
        char *dummy;
        char *ptr;
        char *saveptr;
  
 -      i = -1;
+       if ((buffer == NULL) || (vl == NULL) || (ds == NULL))
+               return EINVAL;
 +      i = 0;
        dummy = buffer;
        saveptr = NULL;
 +      vl->time = 0;
        while ((ptr = strtok_r (dummy, ":", &saveptr)) != NULL)
        {
                dummy = NULL;
                if (i >= vl->values_len)
                {
                        /* Make sure i is invalid. */
 -                      i = vl->values_len + 1;
 +                      i = 0;
                        break;
                }
  
 -              if (i == -1)
 +              if (vl->time == 0)
                {
                        if (strcmp ("N", ptr) == 0)
                                vl->time = cdtime ();
  
                                vl->time = DOUBLE_TO_CDTIME_T (tmp);
                        }
 +
 +                      continue;
                }
 -              else
 -              {
 -                      if ((strcmp ("U", ptr) == 0) && (ds->ds[i].type == DS_TYPE_GAUGE))
 -                              vl->values[i].gauge = NAN;
 -                      else if (0 != parse_value (ptr, &vl->values[i], ds->ds[i].type))
 -                              return -1;
 -              }
 +
 +              if ((strcmp ("U", ptr) == 0) && (ds->ds[i].type == DS_TYPE_GAUGE))
 +                      vl->values[i].gauge = NAN;
 +              else if (0 != parse_value (ptr, &vl->values[i], ds->ds[i].type))
 +                      return -1;
  
                i++;
        } /* while (strtok_r) */
  
 -      if ((ptr != NULL) || (i != vl->values_len))
 +      if ((ptr != NULL) || (i == 0))
                return (-1);
        return (0);
  } /* int parse_values */
@@@ -1377,9 -1380,10 +1380,9 @@@ counter_t counter_diff (counter_t old_v
        if (old_value > new_value)
        {
                if (old_value <= 4294967295U)
 -                      diff = (4294967295U - old_value) + new_value;
 +                      diff = (4294967295U - old_value) + new_value + 1;
                else
 -                      diff = (18446744073709551615ULL - old_value)
 -                              + new_value;
 +                      diff = (18446744073709551615ULL - old_value) + new_value + 1;
        }
        else
        {
@@@ -1484,10 -1488,11 +1487,10 @@@ int rate_to_value (value_t *ret_value, 
        return (0);
  } /* }}} value_t rate_to_value */
  
 -int value_to_rate (value_t *ret_rate, derive_t value, /* {{{ */
 -              value_to_rate_state_t *state,
 -              int ds_type, cdtime_t t)
 +int value_to_rate (gauge_t *ret_rate, /* {{{ */
 +              value_t value, int ds_type, cdtime_t t, value_to_rate_state_t *state)
  {
 -      double interval;
 +      gauge_t interval;
  
        /* Another invalid state: The time is not increasing. */
        if (t <= state->last_time)
        interval = CDTIME_T_TO_DOUBLE(t - state->last_time);
  
        /* Previous value is invalid. */
 -      if (state->last_time == 0) /* {{{ */
 +      if (state->last_time == 0)
        {
 -              if (ds_type == DS_TYPE_DERIVE)
 -              {
 -                      state->last_value.derive = value;
 -              }
 -              else if (ds_type == DS_TYPE_COUNTER)
 -              {
 -                      state->last_value.counter = (counter_t) value;
 -              }
 -              else if (ds_type == DS_TYPE_ABSOLUTE)
 -              {
 -                      state->last_value.absolute = (absolute_t) value;
 -              }
 -              else
 -              {
 -                      assert (23 == 42);
 -              }
 -
 +              state->last_value = value;
                state->last_time = t;
                return (EAGAIN);
 -      } /* }}} */
 +      }
  
 -      if (ds_type == DS_TYPE_DERIVE)
 -      {
 -              ret_rate->gauge = (value - state->last_value.derive) / interval;
 -              state->last_value.derive = value;
 +      switch (ds_type) {
 +      case DS_TYPE_DERIVE: {
 +              derive_t diff = value.derive - state->last_value.derive;
 +              *ret_rate = ((gauge_t) diff) / ((gauge_t) interval);
 +              break;
        }
 -      else if (ds_type == DS_TYPE_COUNTER)
 -      {
 -              ret_rate->gauge = (((counter_t)value) - state->last_value.counter) / interval;
 -              state->last_value.counter = (counter_t) value;
 +      case DS_TYPE_GAUGE: {
 +              *ret_rate = value.gauge;
 +              break;
        }
 -      else if (ds_type == DS_TYPE_ABSOLUTE)
 -      {
 -              ret_rate->gauge = (((absolute_t)value) - state->last_value.absolute) / interval;
 -              state->last_value.absolute = (absolute_t) value;
 +      case DS_TYPE_COUNTER: {
 +              counter_t diff = counter_diff (state->last_value.counter, value.counter);
 +              *ret_rate = ((gauge_t) diff) / ((gauge_t) interval);
 +              break;
        }
 -      else
 -      {
 -              assert (23 == 42);
 +      case DS_TYPE_ABSOLUTE: {
 +              absolute_t diff = value.absolute;
 +              *ret_rate = ((gauge_t) diff) / ((gauge_t) interval);
 +              break;
 +      }
 +      default:
 +              return EINVAL;
        }
  
 -        state->last_time = t;
 +      state->last_value = value;
 +      state->last_time = t;
        return (0);
  } /* }}} value_t rate_to_value */
  
diff --combined src/iptables.c
@@@ -29,6 -29,8 +29,6 @@@
  #include "plugin.h"
  #include "configfile.h"
  
 -#include <sys/socket.h>
 -
  #include <libiptc/libiptc.h>
  #include <libiptc/libip6tc.h>
  
@@@ -109,132 -111,127 +109,127 @@@ static int iptables_config (const char 
                ip_version = IPV4;
        else if (strcasecmp (key, "Chain6") == 0)
                ip_version = IPV6;
+       else
+               return (1);
  
-       if (( ip_version == IPV4 ) || ( ip_version == IPV6 ))
-       {
-               ip_chain_t temp, *final, **list;
-               char *table;
-               int   table_len;
-               char *chain;
-               int   chain_len;
-               char *value_copy;
-               char *fields[4];
-               int   fields_num;
-               
-               memset (&temp, 0, sizeof (temp));
-               value_copy = strdup (value);
-               if (value_copy == NULL)
-               {
-                   char errbuf[1024];
-                   ERROR ("strdup failed: %s",
-                           sstrerror (errno, errbuf, sizeof (errbuf)));
-                   return (1);
-               }
+       ip_chain_t temp, *final, **list;
+       char *table;
+       int   table_len;
+       char *chain;
+       int   chain_len;
  
-               /*
-                *  Time to fill the temp element
-                *  Examine value string, it should look like:
-                *  Chain[6] <table> <chain> [<comment|num> [name]]
-                        */
+       char *value_copy;
+       char *fields[4];
+       int   fields_num;
  
-               /* set IPv4 or IPv6 */
-                 temp.ip_version = ip_version;
+       memset (&temp, 0, sizeof (temp));
  
-               /* Chain <table> <chain> [<comment|num> [name]] */
-               fields_num = strsplit (value_copy, fields, 4);
-               if (fields_num < 2)
-               {
-                   free (value_copy);
-                   return (1);
-               }
+       value_copy = strdup (value);
+       if (value_copy == NULL)
+       {
+           char errbuf[1024];
+           ERROR ("strdup failed: %s",
+                   sstrerror (errno, errbuf, sizeof (errbuf)));
+           return (1);
+       }
  
-               table = fields[0];
-               chain = fields[1];
+       /*
+        *  Time to fill the temp element
+        *  Examine value string, it should look like:
+        *  Chain[6] <table> <chain> [<comment|num> [name]]
+        */
  
-               table_len = strlen (table) + 1;
-               if ((unsigned int)table_len > sizeof(temp.table))
-               {
-                       ERROR ("Table `%s' too long.", table);
-                       free (value_copy);
-                       return (1);
-               }
-               sstrncpy (temp.table, table, table_len);
+       /* set IPv4 or IPv6 */
+       temp.ip_version = ip_version;
  
-               chain_len = strlen (chain) + 1;
-               if ((unsigned int)chain_len > sizeof(temp.chain))
-               {
-                       ERROR ("Chain `%s' too long.", chain);
-                       free (value_copy);
-                       return (1);
-               }
-               sstrncpy (temp.chain, chain, chain_len);
+       /* Chain <table> <chain> [<comment|num> [name]] */
+       fields_num = strsplit (value_copy, fields, 4);
+       if (fields_num < 2)
+       {
+           free (value_copy);
+           return (1);
+       }
  
-               if (fields_num >= 3)
-               {
-                   char *comment = fields[2];
-                   int   rule = atoi (comment);
-                   if (rule)
-                   {
-                       temp.rule.num = rule;
-                       temp.rule_type = RTYPE_NUM;
-                   }
-                   else
-                   {
-                       temp.rule.comment = strdup (comment);
-                       if (temp.rule.comment == NULL)
-                       {
-                           free (value_copy);
-                           return (1);
-                       }
-                       temp.rule_type = RTYPE_COMMENT;
-                   }
-               }
-               else
-               {
-                   temp.rule_type = RTYPE_COMMENT_ALL;
-               }
+       table = fields[0];
+       chain = fields[1];
  
-               if (fields_num >= 4)
-                   sstrncpy (temp.name, fields[3], sizeof (temp.name));
+       table_len = strlen (table) + 1;
+       if ((unsigned int)table_len > sizeof(temp.table))
+       {
+               ERROR ("Table `%s' too long.", table);
+               free (value_copy);
+               return (1);
+       }
+       sstrncpy (temp.table, table, table_len);
  
+       chain_len = strlen (chain) + 1;
+       if ((unsigned int)chain_len > sizeof(temp.chain))
+       {
+               ERROR ("Chain `%s' too long.", chain);
                free (value_copy);
-               value_copy = NULL;
-               table = NULL;
-               chain = NULL;
+               return (1);
+       }
+       sstrncpy (temp.chain, chain, chain_len);
  
-               list = (ip_chain_t **) realloc (chain_list, (chain_num + 1) * sizeof (ip_chain_t *));
-               if (list == NULL)
+       if (fields_num >= 3)
+       {
+           char *comment = fields[2];
+           int   rule = atoi (comment);
+           if (rule)
+           {
+               temp.rule.num = rule;
+               temp.rule_type = RTYPE_NUM;
+           }
+           else
+           {
+               temp.rule.comment = strdup (comment);
+               if (temp.rule.comment == NULL)
                {
-                   char errbuf[1024];
-                   ERROR ("realloc failed: %s",
-                           sstrerror (errno, errbuf, sizeof (errbuf)));
-                   sfree (temp.rule.comment);
+                   free (value_copy);
                    return (1);
                }
+               temp.rule_type = RTYPE_COMMENT;
+           }
+       }
+       else
+       {
+           temp.rule_type = RTYPE_COMMENT_ALL;
+       }
  
-               chain_list = list;
-               final = (ip_chain_t *) malloc( sizeof(temp) );
-               if (final == NULL) 
-               {
-                   char errbuf[1024];
-                   ERROR ("malloc failed: %s",
-                           sstrerror (errno, errbuf, sizeof (errbuf)));
-                   sfree (temp.rule.comment);
-                   return (1);
-               }
-               memcpy (final, &temp, sizeof (temp));
-               chain_list[chain_num] = final;
-               chain_num++;
+       if (fields_num >= 4)
+           sstrncpy (temp.name, fields[3], sizeof (temp.name));
  
-               DEBUG ("Chain #%i: table = %s; chain = %s;", chain_num, final->table, final->chain);
+       free (value_copy);
+       value_copy = NULL;
+       table = NULL;
+       chain = NULL;
+       list = (ip_chain_t **) realloc (chain_list, (chain_num + 1) * sizeof (ip_chain_t *));
+       if (list == NULL)
+       {
+           char errbuf[1024];
+           ERROR ("realloc failed: %s",
+                   sstrerror (errno, errbuf, sizeof (errbuf)));
+           sfree (temp.rule.comment);
+           return (1);
        }
-       else 
+       chain_list = list;
+       final = (ip_chain_t *) malloc( sizeof(temp) );
+       if (final == NULL)
        {
-               return (-1);
+           char errbuf[1024];
+           ERROR ("malloc failed: %s",
+                   sstrerror (errno, errbuf, sizeof (errbuf)));
+           sfree (temp.rule.comment);
+           return (1);
        }
+       memcpy (final, &temp, sizeof (temp));
+       chain_list[chain_num] = final;
+       chain_num++;
+       DEBUG ("Chain #%i: table = %s; chain = %s;", chain_num, final->table, final->chain);
  
        return (0);
  } /* int iptables_config */
@@@ -89,7 -89,6 +89,7 @@@ static int server_close_socket (lcc_ser
      return (0);
  
    close (srv->fd);
 +  srv->fd = -1;
    free (srv->sa);
    srv->sa = NULL;
    srv->sa_len = 0;
@@@ -108,6 -107,12 +108,6 @@@ static void int_server_destroy (lcc_ser
  
    next = srv->next;
  
 -  if (srv->fd >= 0)
 -  {
 -    close (srv->fd);
 -    srv->fd = -1;
 -  }
 -
    free (srv->node);
    free (srv->service);
    free (srv->username);
@@@ -149,7 -154,6 +149,6 @@@ static int server_open_socket (lcc_serv
  
      if (ai_ptr->ai_family == AF_INET)
      {
        struct sockaddr_in *addr = (struct sockaddr_in *) ai_ptr->ai_addr;
        int optname;
  
        else
          optname = IP_TTL;
  
-       setsockopt (srv->fd, IPPROTO_IP, optname,
-           &srv->ttl,
-           sizeof (srv->ttl));
+       status = setsockopt (srv->fd, IPPROTO_IP, optname,
+           &srv->ttl, sizeof (srv->ttl));
      }
      else if (ai_ptr->ai_family == AF_INET6)
      {
        else
          optname = IPV6_UNICAST_HOPS;
  
-       setsockopt (srv->fd, IPPROTO_IPV6, optname,
-           &srv->ttl,
-           sizeof (srv->ttl));
+       status = setsockopt (srv->fd, IPPROTO_IPV6, optname,
+           &srv->ttl, sizeof (srv->ttl));
+     }
+     if (status != 0)
+     {
+       /* setsockopt failed. */
+       close (srv->fd);
+       srv->fd = -1;
+       continue;
      }
  
      srv->sa = malloc (ai_ptr->ai_addrlen);
@@@ -388,7 -397,7 +392,7 @@@ int lcc_server_set_ttl (lcc_server_t *s
  
  int lcc_server_set_interface (lcc_server_t *srv, char const *interface) /* {{{ */
  {
 -  int if_index;
 +  unsigned int if_index;
    int status;
  
    if ((srv == NULL) || (interface == NULL))
        memset (&mreq, 0, sizeof (mreq));
        mreq.imr_multiaddr.s_addr = addr->sin_addr.s_addr;
        mreq.imr_address.s_addr = ntohl (INADDR_ANY);
 -      mreq.imr_ifindex = if_index;
 +      mreq.imr_ifindex = (int) if_index;
  #else
        struct ip_mreq mreq;
  
  
    /* else: Not a multicast interface. */
  #if defined(SO_BINDTODEVICE)
 -  status = setsockopt (srv->fd, SOL_SOCKET, SO_BINDTODEVICE,
 -      interface, strlen (interface) + 1);
 +  status = setsockopt (srv->fd, SOL_SOCKET, SO_BINDTODEVICE, interface,
 +      (socklen_t) (strlen (interface) + 1));
    if (status != 0)
      return (-1);
  #endif