Merge branch 'collectd-5.0' into collectd-5.1
authorFlorian Forster <octo@collectd.org>
Thu, 11 Oct 2012 08:22:53 +0000 (10:22 +0200)
committerFlorian Forster <octo@collectd.org>
Thu, 11 Oct 2012 08:22:53 +0000 (10:22 +0200)
Conflicts:
src/snmp.c

1  2 
configure.in
src/Makefile.am
src/snmp.c

diff --combined configure.in
@@@ -1,5 -1,5 +1,5 @@@
  dnl Process this file with autoconf to produce a configure script.
 -AC_INIT(collectd, m4_esyscmd(./version-gen.sh))
 +AC_INIT(collectd, [m4_esyscmd(./version-gen.sh)])
  AC_CONFIG_SRCDIR(src/collectd.c)
  AC_CONFIG_HEADERS(src/config.h)
  AC_CONFIG_AUX_DIR([libltdl/config])
  # For hddtemp module
  AC_CHECK_HEADERS(linux/major.h libgen.h)
  
 +# For md module (Linux only)
 +if test "x$ac_system" = "xLinux"
 +then
 +      AC_CHECK_HEADERS(linux/raid/md_u.h,
 +                       [have_linux_raid_md_u_h="yes"],
 +                       [have_linux_raid_md_u_h="no"],
 +[
 +#include <sys/ioctl.h>
 +#include <linux/major.h>
 +#include <linux/types.h>
 +])
 +else
 +      have_linux_raid_md_u_h="no"
 +fi
 +
  # For the battery plugin
  AC_CHECK_HEADERS(IOKit/ps/IOPowerSources.h, [], [],
  [
@@@ -404,33 -389,6 +404,33 @@@ AC_CHECK_HEADERS(linux/netdevice.h, []
  #endif
  ])
  
 +# For ethstat module
 +AC_CHECK_HEADERS(linux/sockios.h,
 +    [have_linux_sockios_h="yes"],
 +    [have_linux_sockios_h="no"],
 +    [
 +#if HAVE_SYS_IOCTL_H
 +# include <sys/ioctl.h>
 +#endif
 +#if HAVE_NET_IF_H
 +# include <net/if.h>
 +#endif
 +    ])
 +AC_CHECK_HEADERS(linux/ethtool.h,
 +    [have_linux_ethtool_h="yes"],
 +    [have_linux_ethtool_h="no"],
 +    [
 +#if HAVE_SYS_IOCTL_H
 +# include <sys/ioctl.h>
 +#endif
 +#if HAVE_NET_IF_H
 +# include <net/if.h>
 +#endif
 +#if HAVE_LINUX_SOCKIOS_H
 +# include <linux/sockios.h>
 +#endif
 +    ])
 +
  # For ipvs module
  have_linux_ip_vs_h="no"
  have_net_ip_vs_h="no"
@@@ -1306,7 -1264,6 +1306,7 @@@ AC_CHECK_MEMBERS([kstat_io_t.nwritten, 
  #
  # Checks for libraries begin here
  #
 +
  with_libresolv="yes"
  AC_CHECK_LIB(resolv, res_search,
  [
  fi
  if test "x$with_libmodbus" = "xuse_pkgconfig"
  then
 -      AC_MSG_NOTICE([Checking for modbus using $PKG_CONFIG])
 -      $PKG_CONFIG --exists 'modbus' 2>/dev/null
 +      AC_MSG_NOTICE([Checking for libmodbus using $PKG_CONFIG])
 +      $PKG_CONFIG --exists 'libmodbus' 2>/dev/null
        if test $? -ne 0
        then
 -              with_libmodbus="no (pkg-config doesn't know modbus)"
 +              with_libmodbus="no (pkg-config doesn't know libmodbus)"
        fi
  fi
  if test "x$with_libmodbus" = "xuse_pkgconfig"
  then
 -      with_libmodbus_cflags="`$PKG_CONFIG --cflags 'modbus'`"
 +      with_libmodbus_cflags="`$PKG_CONFIG --cflags 'libmodbus'`"
        if test $? -ne 0
        then
                with_libmodbus="no ($PKG_CONFIG failed)"
        fi
 -      with_libmodbus_libs="`$PKG_CONFIG --libs 'modbus'`"
 +      with_libmodbus_libs="`$PKG_CONFIG --libs 'libmodbus'`"
        if test $? -ne 0
        then
                with_libmodbus="no ($PKG_CONFIG failed)"
  fi
  # }}}
  
 +# --with-libmongoc {{{
 +AC_ARG_WITH(libmongoc, [AS_HELP_STRING([--with-libmongoc@<:@=PREFIX@:>@], [Path to libmongoc.])],
 +[
 + if test "x$withval" = "xyes"
 + then
 +       with_libmongoc="yes"
 + else if test "x$withval" = "xno"
 + then
 +       with_libmongoc="no"
 + else
 +       with_libmongoc="yes"
 +       LIBMONGOC_CPPFLAGS="$LIBMONGOC_CPPFLAGS -I$withval/include"
 +       LIBMONGOC_LDFLAGS="$LIBMONGOC_LDFLAGS -L$withval/lib"
 + fi; fi
 +],
 +[with_libmongoc="yes"])
 +
 +SAVE_CPPFLAGS="$CPPFLAGS"
 +SAVE_LDFLAGS="$LDFLAGS"
 +
 +CPPFLAGS="$CPPFLAGS $LIBMONGOC_CPPFLAGS"
 +LDFLAGS="$LDFLAGS $LIBMONGOC_LDFLAGS"
 +
 +if test "x$with_libmongoc" = "xyes"
 +then
 +      if test "x$LIBMONGOC_CPPFLAGS" != "x"
 +      then
 +              AC_MSG_NOTICE([libmongoc CPPFLAGS: $LIBMONGOC_CPPFLAGS])
 +      fi
 +      AC_CHECK_HEADERS(mongo.h,
 +      [with_libmongoc="yes"],
 +      [with_libmongoc="no ('mongo.h' not found)"],
 +[#if HAVE_STDINT_H
 +# define MONGO_HAVE_STDINT 1
 +#else
 +# define MONGO_USE_LONG_LONG_INT 1
 +#endif
 +])
 +fi
 +if test "x$with_libmongoc" = "xyes"
 +then
 +      if test "x$LIBMONGOC_LDFLAGS" != "x"
 +      then
 +              AC_MSG_NOTICE([libmongoc LDFLAGS: $LIBMONGOC_LDFLAGS])
 +      fi
 +      AC_CHECK_LIB(mongoc, mongo_run_command,
 +      [with_libmongoc="yes"],
 +      [with_libmongoc="no (symbol 'mongo_run_command' not found)"])
 +fi
 +
 +CPPFLAGS="$SAVE_CPPFLAGS"
 +LDFLAGS="$SAVE_LDFLAGS"
 +
 +if test "x$with_libmongoc" = "xyes"
 +then
 +      BUILD_WITH_LIBMONGOC_CPPFLAGS="$LIBMONGOC_CPPFLAGS"
 +      BUILD_WITH_LIBMONGOC_LDFLAGS="$LIBMONGOC_LDFLAGS"
 +      AC_SUBST(BUILD_WITH_LIBMONGOC_CPPFLAGS)
 +      AC_SUBST(BUILD_WITH_LIBMONGOC_LDFLAGS)
 +fi
 +AM_CONDITIONAL(BUILD_WITH_LIBMONGOC, test "x$with_libmongoc" = "xyes")
 +# }}}
 +
  # --with-libmysql {{{
  with_mysql_config="mysql_config"
  with_mysql_cflags=""
@@@ -2986,7 -2880,7 +2986,7 @@@ AM_CONDITIONAL(BUILD_WITH_LIBPCAP, tes
  perl_interpreter="perl"
  AC_ARG_WITH(libperl, [AS_HELP_STRING([--with-libperl@<:@=PREFIX@:>@], [Path to libperl.])],
  [
-       if test -x "$withval"
+       if test -f "$withval" && test -x "$withval"
        then
                perl_interpreter="$withval"
                with_libperl="yes"
@@@ -4193,9 -4087,10 +4193,9 @@@ the
        CPPFLAGS="$CPPFLAGS $with_libvarnish_cflags"
        #LDFLAGS="$LDFLAGS $with_libvarnish_libs"
  
 -      AC_CHECK_LIB(varnishapi, VSL_OpenStats,
 -                   [with_libvarnish="yes"],
 -                   [with_libvarnish="no (symbol VSL_OpenStats not found)"],
 -                   [$with_libvarnish_libs])
 +    AC_CHECK_HEADERS(varnish/vsc.h,
 +        [AC_DEFINE([HAVE_VARNISH_V3], [1], [Varnish 3 API support])],
 +        [AC_DEFINE([HAVE_VARNISH_V2], [1], [Varnish 2 API support])])
  
        CPPFLAGS="$SAVE_CPPFLAGS"
        #LDFLAGS="$SAVE_LDFLAGS"
@@@ -4553,8 -4448,6 +4553,8 @@@ plugin_curl_xml="no
  plugin_df="no"
  plugin_disk="no"
  plugin_entropy="no"
 +plugin_ethstat="no"
 +plugin_fscache="no"
  plugin_interface="no"
  plugin_ipmi="no"
  plugin_ipvs="no"
@@@ -4564,7 -4457,7 +4564,7 @@@ plugin_load="no
  plugin_memory="no"
  plugin_multimeter="no"
  plugin_nfs="no"
 -plugin_fscache="no"
 +plugin_numa="no"
  plugin_perl="no"
  plugin_processes="no"
  plugin_protocols="no"
        plugin_cpufreq="yes"
        plugin_disk="yes"
        plugin_entropy="yes"
 +      plugin_fscache="yes"
        plugin_interface="yes"
        plugin_irq="yes"
        plugin_load="yes"
        plugin_memory="yes"
        plugin_nfs="yes"
 -      plugin_fscache="yes"
 +      plugin_numa="yes"
        plugin_processes="yes"
        plugin_protocols="yes"
        plugin_serial="yes"
  fi
  
  # AIX
 +
 +if test "x$ac_system" = "xAIX"
 +then
 +        plugin_tcpconns="yes"
 +fi
 +
  if test "x$with_perfstat" = "xyes"
  then
        plugin_cpu="yes"
  # Solaris
  if test "x$with_kstat" = "xyes"
  then
 +      plugin_nfs="yes"
        plugin_uptime="yes"
        plugin_zfs_arc="yes"
  fi
        fi
  fi
  
 +if test "x$have_linux_sockios_h$have_linux_ethtool_h" = "xyesyes"
 +then
 +      plugin_ethstat="yes"
 +fi
 +
  if test "x$have_getifaddrs" = "xyes"
  then
        plugin_interface="yes"
@@@ -4872,7 -4752,6 +4872,7 @@@ AC_PLUGIN([disk],        [$plugin_disk]
  AC_PLUGIN([dns],         [$with_libpcap],      [DNS traffic analysis])
  AC_PLUGIN([email],       [yes],                [EMail statistics])
  AC_PLUGIN([entropy],     [$plugin_entropy],    [Entropy statistics])
 +AC_PLUGIN([ethstat],     [$plugin_ethstat],    [Stats from NIC driver])
  AC_PLUGIN([exec],        [yes],                [Execution of external programs])
  AC_PLUGIN([filecount],   [yes],                [Count files in directories])
  AC_PLUGIN([fscache],     [$plugin_fscache],    [fscache statistics])
@@@ -4895,7 -4774,6 +4895,7 @@@ AC_PLUGIN([match_regex], [yes]
  AC_PLUGIN([match_timediff], [yes],             [The timediff match])
  AC_PLUGIN([match_value], [yes],                [The value match])
  AC_PLUGIN([mbmon],       [yes],                [Query mbmond])
 +AC_PLUGIN([md],          [$have_linux_raid_md_u_h], [md (Linux software RAID) devices])
  AC_PLUGIN([memcachec],   [$with_libmemcached], [memcachec statistics])
  AC_PLUGIN([memcached],   [yes],                [memcached statistics])
  AC_PLUGIN([memory],      [$plugin_memory],     [Memory usage])
@@@ -4910,7 -4788,6 +4910,7 @@@ AC_PLUGIN([nginx],       [$with_libcurl
  AC_PLUGIN([notify_desktop], [$with_libnotify], [Desktop notifications])
  AC_PLUGIN([notify_email], [$with_libesmtp],    [Email notifier])
  AC_PLUGIN([ntpd],        [yes],                [NTPd statistics])
 +AC_PLUGIN([numa],        [$plugin_numa],       [NUMA virtual memory statistics])
  AC_PLUGIN([nut],         [$with_libupsclient], [Network UPS tools statistics])
  AC_PLUGIN([olsrd],       [yes],                [olsrd statistics])
  AC_PLUGIN([onewire],     [$with_libowcapi],    [OneWire sensor statistics])
@@@ -4956,10 -4833,8 +4956,10 @@@ AC_PLUGIN([varnish],     [$with_libvarn
  AC_PLUGIN([vmem],        [$plugin_vmem],       [Virtual memory statistics])
  AC_PLUGIN([vserver],     [$plugin_vserver],    [Linux VServer statistics])
  AC_PLUGIN([wireless],    [$plugin_wireless],   [Wireless statistics])
 +AC_PLUGIN([write_graphite], [yes],             [Graphite / Carbon output plugin])
  AC_PLUGIN([write_http],  [$with_libcurl],      [HTTP output plugin])
  AC_PLUGIN([write_redis], [$with_libcredis],    [Redis output plugin])
 +AC_PLUGIN([write_mongodb], [$with_libmongoc],  [MongoDB output plugin])
  AC_PLUGIN([xmms],        [$with_libxmms],      [XMMS statistics])
  AC_PLUGIN([zfs_arc],     [$plugin_zfs_arc],    [ZFS ARC statistics])
  
@@@ -5102,7 -4977,7 +5102,7 @@@ AC_SUBST(LCC_VERSION_STRING
  
  AC_CONFIG_FILES(src/libcollectdclient/lcc_features.h)
  
 -AC_OUTPUT(Makefile src/Makefile src/collectd.conf src/owniptc/Makefile src/libcollectdclient/Makefile src/libcollectdclient/libcollectdclient.pc src/liboconfig/Makefile bindings/Makefile bindings/java/Makefile)
 +AC_OUTPUT(Makefile src/Makefile src/collectd.conf src/libcollectdclient/Makefile src/libcollectdclient/libcollectdclient.pc src/liboconfig/Makefile bindings/Makefile bindings/java/Makefile)
  
  if test "x$with_librrd" = "xyes" \
        && test "x$librrd_threadsafe" != "xyes"
@@@ -5204,7 -5079,6 +5204,7 @@@ Configuration
      dns . . . . . . . . . $enable_dns
      email . . . . . . . . $enable_email
      entropy . . . . . . . $enable_entropy
 +    ethstat . . . . . . . $enable_ethstat
      exec  . . . . . . . . $enable_exec
      filecount . . . . . . $enable_filecount
      fscache . . . . . . . $enable_fscache
      match_timediff  . . . $enable_match_timediff
      match_value . . . . . $enable_match_value
      mbmon . . . . . . . . $enable_mbmon
 +    md  . . . . . . . . . $enable_md
      memcachec . . . . . . $enable_memcachec
      memcached . . . . . . $enable_memcached
      memory  . . . . . . . $enable_memory
      notify_desktop  . . . $enable_notify_desktop
      notify_email  . . . . $enable_notify_email
      ntpd  . . . . . . . . $enable_ntpd
 +    numa  . . . . . . . . $enable_numa
      nut . . . . . . . . . $enable_nut
      olsrd . . . . . . . . $enable_olsrd
      onewire . . . . . . . $enable_onewire
      vmem  . . . . . . . . $enable_vmem
      vserver . . . . . . . $enable_vserver
      wireless  . . . . . . $enable_wireless
 +    write_graphite  . . . $enable_write_graphite
      write_http  . . . . . $enable_write_http
      write_redis . . . . . $enable_write_redis
 +    write_mongodb . . . . $enable_write_mongodb
      xmms  . . . . . . . . $enable_xmms
      zfs_arc . . . . . . . $enable_zfs_arc
  
diff --combined src/Makefile.am
@@@ -1,4 -1,7 +1,4 @@@
  SUBDIRS = libcollectdclient
 -if BUILD_WITH_OWN_LIBIPTC
 -SUBDIRS += owniptc
 -endif
  if BUILD_WITH_OWN_LIBOCONFIG
  SUBDIRS += liboconfig
  endif
@@@ -377,14 -380,6 +377,14 @@@ collectd_LDADD += "-dlopen" exec.l
  collectd_DEPENDENCIES += exec.la
  endif
  
 +if BUILD_PLUGIN_ETHSTAT
 +pkglib_LTLIBRARIES += ethstat.la
 +ethstat_la_SOURCES = ethstat.c
 +ethstat_la_LDFLAGS = -module -avoid-version
 +collectd_LDADD += "-dlopen" ethstat.la
 +collectd_DEPENDENCIES += ethstat.la
 +endif
 +
  if BUILD_PLUGIN_FILECOUNT
  pkglib_LTLIBRARIES += filecount.la
  filecount_la_SOURCES = filecount.c
@@@ -444,7 -439,12 +444,7 @@@ pkglib_LTLIBRARIES += iptables.l
  iptables_la_SOURCES = iptables.c
  iptables_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBIPTC_CPPFLAGS)
  iptables_la_LDFLAGS = -module -avoid-version $(BUILD_WITH_LIBIPTC_LDFLAGS)
 -if BUILD_WITH_OWN_LIBIPTC
 -iptables_la_LIBADD  = owniptc/libiptc.la
 -iptables_la_DEPENDENCIES = owniptc/libiptc.la
 -else
  iptables_la_LIBADD = -liptc
 -endif
  collectd_LDADD += "-dlopen" iptables.la
  collectd_DEPENDENCIES += iptables.la
  endif
@@@ -594,14 -594,6 +594,14 @@@ collectd_LDADD += "-dlopen" mbmon.l
  collectd_DEPENDENCIES += mbmon.la
  endif
  
 +if BUILD_PLUGIN_MD
 +pkglib_LTLIBRARIES += md.la
 +md_la_SOURCES = md.c
 +md_la_LDFLAGS = -module -avoid-version
 +collectd_LDADD += "-dlopen" md.la
 +collectd_DEPENDENCIES += md.la
 +endif
 +
  if BUILD_PLUGIN_MEMCACHEC
  pkglib_LTLIBRARIES += memcachec.la
  memcachec_la_SOURCES = memcachec.c
@@@ -779,14 -771,6 +779,14 @@@ collectd_LDADD += "-dlopen" ntpd.l
  collectd_DEPENDENCIES += ntpd.la
  endif
  
 +if BUILD_PLUGIN_NUMA
 +pkglib_LTLIBRARIES += numa.la
 +numa_la_SOURCES = numa.c
 +numa_la_LDFLAGS = -module -avoid-version
 +collectd_LDADD += "-dlopen" numa.la
 +collectd_DEPENDENCIES += numa.la
 +endif
 +
  if BUILD_PLUGIN_NUT
  pkglib_LTLIBRARIES += nut.la
  nut_la_SOURCES = nut.c
@@@ -1253,15 -1237,6 +1253,15 @@@ collectd_LDADD += "-dlopen" wireless.l
  collectd_DEPENDENCIES += wireless.la
  endif
  
 +if BUILD_PLUGIN_WRITE_GRAPHITE
 +pkglib_LTLIBRARIES += write_graphite.la
 +write_graphite_la_SOURCES = write_graphite.c \
 +                      utils_format_json.c utils_format_json.h
 +write_graphite_la_LDFLAGS = -module -avoid-version
 +collectd_LDADD += "-dlopen" write_graphite.la
 +collectd_DEPENDENCIES += write_graphite.la
 +endif
 +
  if BUILD_PLUGIN_WRITE_HTTP
  pkglib_LTLIBRARIES += write_http.la
  write_http_la_SOURCES = write_http.c \
@@@ -1277,16 -1252,6 +1277,16 @@@ endi
  collectd_DEPENDENCIES += write_http.la
  endif
  
 +if BUILD_PLUGIN_WRITE_MONGODB
 +pkglib_LTLIBRARIES += write_mongodb.la
 +write_mongodb_la_SOURCES = write_mongodb.c
 +write_mongodb_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBMONGOC_CPPFLAGS)
 +write_mongodb_la_LDFLAGS = -module -avoid-version $(BUILD_WITH_LIBMONGOC_LDFLAGS)
 +write_mongodb_la_LIBADD = -lmongoc
 +collectd_LDADD += "-dlopen" write_mongodb.la
 +collectd_DEPENDENCIES += write_mongodb.la
 +endif
 +
  if BUILD_PLUGIN_WRITE_REDIS
  pkglib_LTLIBRARIES += write_redis.la
  write_redis_la_SOURCES = write_redis.c
@@@ -1383,3 -1348,8 +1383,8 @@@ install-exec-hook
        $(INSTALL) -m 0644 $(srcdir)/types.db $(DESTDIR)$(pkgdatadir)/types.db;
        $(INSTALL) -m 0644 $(srcdir)/postgresql_default.conf \
                $(DESTDIR)$(pkgdatadir)/postgresql_default.conf;
+ uninstall-hook:
+       rm -f $(DESTDIR)$(pkgdatadir)/types.db;
+       rm -f $(DESTDIR)$(sysconfdir)/collectd.conf
+       rm -f $(DESTDIR)$(pkgdatadir)/postgresql_default.conf;
diff --combined src/snmp.c
@@@ -1,6 -1,6 +1,6 @@@
  /**
   * collectd - src/snmp.c
-  * Copyright (C) 2007  Florian octo Forster
+  * Copyright (C) 2007-2012  Florian octo Forster
   *
   * 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
@@@ -16,7 -16,7 +16,7 @@@
   * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
   *
   * Authors:
-  *   Florian octo Forster <octo at verplant.org>
+  *   Florian octo Forster <octo at collectd.org>
   **/
  
  #include "collectd.h"
@@@ -79,7 -79,7 +79,7 @@@ typedef struct host_definition_s host_d
   * gaps in tables. */
  struct csnmp_list_instances_s
  {
-   oid subid;
+   oid_t suffix;
    char instance[DATA_MAX_NAME_LEN];
    struct csnmp_list_instances_s *next;
  };
@@@ -87,7 -87,7 +87,7 @@@ typedef struct csnmp_list_instances_s c
  
  struct csnmp_table_values_s
  {
-   oid subid;
+   oid_t suffix;
    value_t value;
    struct csnmp_table_values_s *next;
  };
@@@ -106,6 -106,54 +106,54 @@@ static int csnmp_read_host (user_data_
  /*
   * Private functions
   */
+ static void csnmp_oid_init (oid_t *dst, oid const *src, size_t n)
+ {
+   assert (n <= STATIC_ARRAY_LEN (dst->oid));
+   memcpy (dst->oid, src, sizeof (*src) * n);
+   dst->oid_len = n;
+ }
+ static int csnmp_oid_compare (oid_t const *left, oid_t const *right)
+ {
+   return (snmp_oid_compare (left->oid, left->oid_len,
+         right->oid, right->oid_len));
+ }
+ static int csnmp_oid_suffix (oid_t *dst, oid_t const *src,
+     oid_t const *root)
+ {
+   /* Make sure "src" is in "root"s subtree. */
+   if (src->oid_len <= root->oid_len)
+     return (EINVAL);
+   if (snmp_oid_ncompare (root->oid, root->oid_len,
+         src->oid, src->oid_len,
+         /* n = */ root->oid_len) != 0)
+     return (EINVAL);
+   memset (dst, 0, sizeof (*dst));
+   dst->oid_len = src->oid_len - root->oid_len;
+   memcpy (dst->oid, &src->oid[root->oid_len],
+       dst->oid_len * sizeof (dst->oid[0]));
+   return (0);
+ }
+ static int csnmp_oid_to_string (char *buffer, size_t buffer_size,
+     oid_t const *o)
+ {
+   char oid_str[MAX_OID_LEN][16];
+   char *oid_str_ptr[MAX_OID_LEN];
+   size_t i;
+   for (i = 0; i < o->oid_len; i++)
+   {
+     ssnprintf (oid_str[i], sizeof (oid_str[i]), "%lu", (unsigned long) o->oid[i]);
+     oid_str_ptr[i] = oid_str[i];
+   }
+   return (strjoin (buffer, buffer_size,
+         oid_str_ptr, o->oid_len, /* separator = */ "."));
+ }
  static void csnmp_host_close_session (host_definition_t *host) /* {{{ */
  {
    if (host->sess_handle == NULL)
@@@ -127,7 -175,7 +175,7 @@@ static void csnmp_host_definition_destr
    if (hd->name != NULL)
    {
      DEBUG ("snmp plugin: Destroying host definition for host `%s'.",
-       hd->name);
+         hd->name);
    }
  
    csnmp_host_close_session (hd);
@@@ -212,10 -260,10 +260,10 @@@ static int csnmp_config_add_data_instan
      dd->instance.oid.oid_len = MAX_OID_LEN;
  
      if (!read_objid (ci->values[0].value.string,
-         dd->instance.oid.oid, &dd->instance.oid.oid_len))
+           dd->instance.oid.oid, &dd->instance.oid.oid_len))
      {
        ERROR ("snmp plugin: read_objid (%s) failed.",
-         ci->values[0].value.string);
+           ci->values[0].value.string);
        return (-1);
      }
    }
    {
      /* Instance is a simple string */
      sstrncpy (dd->instance.string, ci->values[0].value.string,
-       sizeof (dd->instance.string));
+         sizeof (dd->instance.string));
    }
  
    return (0);
@@@ -241,7 -289,7 +289,7 @@@ static int csnmp_config_add_data_instan
    if (!dd->is_table)
    {
      WARNING ("snmp plugin: data %s: InstancePrefix is ignored when `Table' "
-       "is set to `false'.", dd->name);
+         "is set to `false'.", dd->name);
      return (-1);
    }
  
@@@ -282,10 -330,10 +330,10 @@@ static int csnmp_config_add_data_value
      dd->values[i].oid_len = MAX_OID_LEN;
  
      if (NULL == snmp_parse_oid (ci->values[i].value.string,
-         dd->values[i].oid, &dd->values[i].oid_len))
+           dd->values[i].oid, &dd->values[i].oid_len))
      {
        ERROR ("snmp plugin: snmp_parse_oid (%s) failed.",
-         ci->values[i].value.string);
+           ci->values[i].value.string);
        free (dd->values);
        dd->values = NULL;
        dd->values_len = 0;
@@@ -523,17 -571,17 +571,17 @@@ static int csnmp_config_add_host_collec
    {
      for (data = data_head; data != NULL; data = data->next)
        if (strcasecmp (ci->values[i].value.string, data->name) == 0)
-       break;
+         break;
  
      if (data == NULL)
      {
        WARNING ("snmp plugin: No such data configured: `%s'",
-         ci->values[i].value.string);
+           ci->values[i].value.string);
        continue;
      }
  
      DEBUG ("snmp plugin: Collect: host = %s, data[%i] = %s;",
-       host->name, host->data_list_len, data->name);
+         host->name, host->data_list_len, data->name);
  
      host->data_list[host->data_list_len] = data;
      host->data_list_len++;
@@@ -696,15 -744,14 +744,15 @@@ static void csnmp_host_open_session (ho
      snmp_error (&sess, NULL, NULL, &errstr);
  
      ERROR ("snmp plugin: host %s: snmp_sess_open failed: %s",
-       host->name, (errstr == NULL) ? "Unknown problem" : errstr);
+         host->name, (errstr == NULL) ? "Unknown problem" : errstr);
      sfree (errstr);
    }
  } /* void csnmp_host_open_session */
  
  /* TODO: Check if negative values wrap around. Problem: negative temperatures. */
  static value_t csnmp_value_list_to_value (struct variable_list *vl, int type,
 -    double scale, double shift)
 +    double scale, double shift,
 +    const char *host_name, const char *data_name)
  {
    value_t ret;
    uint64_t tmp_unsigned = 0;
  
      memset (oid_buffer, 0, sizeof (oid_buffer));
      snprint_objid (oid_buffer, sizeof (oid_buffer) - 1,
-       vl->name, vl->name_length);
+         vl->name, vl->name_length);
  
  #ifdef ASN_NULL
      if (vl->type == ASN_NULL)
        INFO ("snmp plugin: OID \"%s\" is undefined (type ASN_NULL)",
-         oid_buffer);
+           oid_buffer);
      else
  #endif
 -      WARNING ("snmp plugin: I don't know the ASN type \"%i\" (OID: %s)",
 -          (int) vl->type, oid_buffer);
 +      WARNING ("snmp plugin: I don't know the ASN type #%i "
 +               "(OID: \"%s\", data block \"%s\", host block \"%s\")",
 +          (int) vl->type, oid_buffer,
 +          (data_name != NULL) ? data_name : "UNKNOWN",
 +          (host_name != NULL) ? host_name : "UNKNOWN");
  
      defined = 0;
    }
  
        string_length = sizeof (string) - 1;
        if (vl->val_len < string_length)
-       string_length = vl->val_len;
+         string_length = vl->val_len;
  
        /* The strings we get from the Net-SNMP library may not be null
         * terminated. That is why we're using `memcpy' here and not `strcpy'.
        status = parse_value (string, &ret, type);
        if (status != 0)
        {
-       ERROR ("snmp plugin: csnmp_value_list_to_value: Parsing string as %s failed: %s",
-           DS_TYPE_TO_STRING (type), string);
+         ERROR ("snmp plugin: csnmp_value_list_to_value: Parsing string as %s failed: %s",
+             DS_TYPE_TO_STRING (type), string);
        }
      }
  
      {
        switch (type)
        {
-       case DS_TYPE_COUNTER:
-       case DS_TYPE_DERIVE:
-       case DS_TYPE_ABSOLUTE:
-         memset (&ret, 0, sizeof (ret));
-         break;
-       case DS_TYPE_GAUGE:
-         ret.gauge = NAN;
-         break;
-       default:
-         ERROR ("snmp plugin: csnmp_value_list_to_value: Unknown "
-             "data source type: %i.", type);
-         ret.gauge = NAN;
+         case DS_TYPE_COUNTER:
+         case DS_TYPE_DERIVE:
+         case DS_TYPE_ABSOLUTE:
+           memset (&ret, 0, sizeof (ret));
+           break;
+         case DS_TYPE_GAUGE:
+           ret.gauge = NAN;
+           break;
+         default:
+           ERROR ("snmp plugin: csnmp_value_list_to_value: Unknown "
+               "data source type: %i.", type);
+           ret.gauge = NAN;
        }
      }
    } /* if (vl->type == ASN_OCTET_STR) */
    else
    {
      ERROR ("snmp plugin: csnmp_value_list_to_value: Unknown data source "
-       "type: %i.", type);
+         "type: %i.", type);
      ret.gauge = NAN;
    }
  
@@@ -873,10 -917,10 +921,10 @@@ static int csnmp_check_res_left_subtre
      num_checked++;
  
      if ((vb->type == SNMP_ENDOFMIBVIEW)
-       || (snmp_oid_ncompare (data->values[i].oid,
-           data->values[i].oid_len,
-           vb->name, vb->name_length,
-           data->values[i].oid_len) != 0))
+         || (snmp_oid_ncompare (data->values[i].oid,
+             data->values[i].oid_len,
+             vb->name, vb->name_length,
+             data->values[i].oid_len) != 0))
        num_left_subtree++;
    }
  
    if (i < data->values_len)
    {
      ERROR ("snmp plugin: host %s: Expected %i variables, but got only %i",
-       host->name, data->values_len, i);
+         host->name, data->values_len, i);
      return (-1);
    }
  
      if (vb == NULL)
      {
        ERROR ("snmp plugin: host %s: Expected one more variable for "
-         "the instance..", host->name);
+           "the instance..", host->name);
        return (-1);
      }
  
      num_checked++;
      if (snmp_oid_ncompare (data->instance.oid.oid,
-         data->instance.oid.oid_len,
-         vb->name, vb->name_length,
-         data->instance.oid.oid_len) != 0)
+           data->instance.oid.oid_len,
+           vb->name, vb->name_length,
+           data->instance.oid.oid_len) != 0)
        num_left_subtree++;
    }
  
@@@ -928,7 -972,7 +976,7 @@@ static int csnmp_strvbcopy_hexstring (c
      int status;
  
      status = snprintf (buffer_ptr, buffer_free,
-       (i == 0) ? "%02x" : ":%02x", (unsigned int) vb->val.bitstring[i]);
+         (i == 0) ? "%02x" : ":%02x", (unsigned int) vb->val.bitstring[i]);
  
      if (status >= buffer_free)
      {
@@@ -981,11 -1025,13 +1029,13 @@@ static int csnmp_strvbcopy (char *dst, 
  
  static int csnmp_instance_list_add (csnmp_list_instances_t **head,
      csnmp_list_instances_t **tail,
 -    struct snmp_pdu const *res,
 -    oid_t const *root)
 +    const struct snmp_pdu *res,
 +    const host_definition_t *hd, const data_definition_t *dd)
  {
    csnmp_list_instances_t *il;
    struct variable_list *vb;
+   oid_t vb_name;
+   int status;
  
    /* Set vb on the last variable */
    for (vb = res->variables;
    if (vb == NULL)
      return (-1);
  
-   il = (csnmp_list_instances_t *) malloc (sizeof (csnmp_list_instances_t));
+   csnmp_oid_init (&vb_name, vb->name, vb->name_length);
+   il = malloc (sizeof (*il));
    if (il == NULL)
    {
      ERROR ("snmp plugin: malloc failed.");
      return (-1);
    }
-   il->subid = vb->name[vb->name_length - 1];
+   memset (il, 0, sizeof (*il));
    il->next = NULL;
  
 -  status = csnmp_oid_suffix (&il->suffix, &vb_name, root);
++  status = csnmp_oid_suffix (&il->suffix, &vb_name, &dd->instance.oid);
+   if (status != 0)
+   {
+     sfree (il);
+     return (status);
+   }
    /* Get instance name */
    if ((vb->type == ASN_OCTET_STR) || (vb->type == ASN_BIT_STR))
    {
      for (ptr = il->instance; *ptr != '\0'; ptr++)
      {
        if ((*ptr > 0) && (*ptr < 32))
-       *ptr = ' ';
+         *ptr = ' ';
        else if (*ptr == '/')
-       *ptr = '_';
+         *ptr = '_';
      }
      DEBUG ("snmp plugin: il->instance = `%s';", il->instance);
    }
    else
    {
 -    value_t val = csnmp_value_list_to_value (vb, DS_TYPE_COUNTER, 1.0, 0.0);
 +    value_t val = csnmp_value_list_to_value (vb, DS_TYPE_COUNTER,
 +        /* scale = */ 1.0, /* shift = */ 0.0, hd->name, dd->name);
      ssnprintf (il->instance, sizeof (il->instance),
-       "%llu", val.counter);
+         "%llu", val.counter);
    }
  
    /* TODO: Debugging output */
@@@ -1050,8 -1104,8 +1109,8 @@@ static int csnmp_dispatch_table (host_d
    csnmp_table_values_t **value_table_ptr;
  
    int i;
-   oid subid;
-   int have_more;
+   _Bool have_more;
+   oid_t current_suffix;
  
    ds = plugin_get_ds (data->type);
    if (!ds)
  
    instance_list_ptr = instance_list;
  
-   value_table_ptr = (csnmp_table_values_t **) malloc (sizeof (csnmp_table_values_t *)
-       * data->values_len);
+   value_table_ptr = malloc (sizeof (*value_table_ptr) * data->values_len);
    if (value_table_ptr == NULL)
      return (-1);
    for (i = 0; i < data->values_len; i++)
      value_table_ptr[i] = value_table[i];
  
    vl.values_len = ds->ds_num;
-   vl.values = (value_t *) malloc (sizeof (value_t) * vl.values_len);
+   vl.values = malloc (sizeof (*vl.values) * vl.values_len);
    if (vl.values == NULL)
    {
      ERROR ("snmp plugin: malloc failed.");
  
    vl.interval = host->interval;
  
-   subid = 0;
    have_more = 1;
-   while (have_more != 0)
+   memset (&current_suffix, 0, sizeof (current_suffix));
+   while (have_more)
    {
+     _Bool suffix_skipped = 0;
+     /* Determine next suffix to handle. */
      if (instance_list != NULL)
      {
-       while ((instance_list_ptr != NULL)
-         && (instance_list_ptr->subid < subid))
-       instance_list_ptr = instance_list_ptr->next;
        if (instance_list_ptr == NULL)
        {
-       have_more = 0;
-       continue;
+         have_more = 0;
+         continue;
        }
-       else if (instance_list_ptr->subid > subid)
+       memcpy (&current_suffix, &instance_list_ptr->suffix, sizeof (current_suffix));
+     }
+     else /* no instance configured */
+     {
+       csnmp_table_values_t *ptr = value_table_ptr[0];
+       if (ptr == NULL)
        {
-       subid = instance_list_ptr->subid;
-       continue;
+         have_more = 0;
+         continue;
        }
-     } /* if (instance_list != NULL) */
  
+       memcpy (&current_suffix, &ptr->suffix, sizeof (current_suffix));
+     }
+     /* Update all the value_table_ptr to point at the entry with the same
+      * trailing partial OID */
      for (i = 0; i < data->values_len; i++)
      {
        while ((value_table_ptr[i] != NULL)
-         && (value_table_ptr[i]->subid < subid))
-       value_table_ptr[i] = value_table_ptr[i]->next;
+           && (csnmp_oid_compare (&value_table_ptr[i]->suffix, &current_suffix) < 0))
+         value_table_ptr[i] = value_table_ptr[i]->next;
  
        if (value_table_ptr[i] == NULL)
        {
-       have_more = 0;
-       break;
+         have_more = 0;
+         break;
        }
-       else if (value_table_ptr[i]->subid > subid)
+       else if (csnmp_oid_compare (&value_table_ptr[i]->suffix, &current_suffix) > 0)
        {
-       subid = value_table_ptr[i]->subid;
-       break;
+         /* This suffix is missing in the subtree. Indicate this with the
+          * "suffix_skipped" flag and try the next instance / suffix. */
+         suffix_skipped = 1;
+         break;
        }
      } /* for (i = 0; i < columns; i++) */
-     /* The subid has been increased - start scanning from the beginning
-      * again.. */
-     if (i < data->values_len)
+     if (!have_more)
+       break;
+     /* Matching the values failed. Start from the beginning again. */
+     if (suffix_skipped)
+     {
+       if (instance_list != NULL)
+         instance_list_ptr = instance_list_ptr->next;
+       else
+         value_table_ptr[0] = value_table_ptr[0]->next;
        continue;
+     }
  
      /* if we reach this line, all value_table_ptr[i] are non-NULL and are set
       * to the same subid. instance_list_ptr is either NULL or points to the
      for (i = 1; i < data->values_len; i++)
      {
        assert (value_table_ptr[i] != NULL);
-       assert (value_table_ptr[i-1]->subid == value_table_ptr[i]->subid);
+       assert (csnmp_oid_compare (&value_table_ptr[i-1]->suffix,
+             &value_table_ptr[i]->suffix) == 0);
      }
      assert ((instance_list_ptr == NULL)
-       || (instance_list_ptr->subid == value_table_ptr[0]->subid));
+         || (csnmp_oid_compare (&instance_list_ptr->suffix,
+             &value_table_ptr[0]->suffix) == 0));
  #endif
  
      sstrncpy (vl.type, data->type, sizeof (vl.type));
        char temp[DATA_MAX_NAME_LEN];
  
        if (instance_list_ptr == NULL)
-       ssnprintf (temp, sizeof (temp), "%"PRIu32, (uint32_t) subid);
+         csnmp_oid_to_string (temp, sizeof (temp), &current_suffix);
        else
-       sstrncpy (temp, instance_list_ptr->instance, sizeof (temp));
+         sstrncpy (temp, instance_list_ptr->instance, sizeof (temp));
  
        if (data->instance_prefix == NULL)
-       sstrncpy (vl.type_instance, temp, sizeof (vl.type_instance));
+         sstrncpy (vl.type_instance, temp, sizeof (vl.type_instance));
        else
-       ssnprintf (vl.type_instance, sizeof (vl.type_instance), "%s%s",
-           data->instance_prefix, temp);
+         ssnprintf (vl.type_instance, sizeof (vl.type_instance), "%s%s",
+             data->instance_prefix, temp);
      }
  
      for (i = 0; i < data->values_len; i++)
      /* If we get here `vl.type_instance' and all `vl.values' have been set */
      plugin_dispatch_values (&vl);
  
-     subid++;
-   } /* while (have_more != 0) */
+     if (instance_list != NULL)
+       instance_list_ptr = instance_list_ptr->next;
+     else
+       value_table_ptr[0] = value_table_ptr[0]->next;
+   } /* while (have_more) */
  
    sfree (vl.values);
    sfree (value_table_ptr);
@@@ -1187,13 -1265,13 +1270,13 @@@ static int csnmp_read_table (host_defin
    int status;
    int i;
  
-   /* `value_table' and `value_table_ptr' implement a linked list for each
-    * value. `instance_list' and `instance_list_ptr' implement a linked list of
+   /* `value_list_head' and `value_list_tail' implement a linked list for each
+    * value. `instance_list_head' and `instance_list_tail' implement a linked list of
     * instance names. This is used to jump gaps in the table. */
-   csnmp_list_instances_t *instance_list;
-   csnmp_list_instances_t *instance_list_ptr;
-   csnmp_table_values_t **value_table;
-   csnmp_table_values_t **value_table_ptr;
+   csnmp_list_instances_t *instance_list_head;
+   csnmp_list_instances_t *instance_list_tail;
+   csnmp_table_values_t **value_list_head;
+   csnmp_table_values_t **value_list_tail;
  
    DEBUG ("snmp plugin: csnmp_read_table (host = %s, data = %s)",
        host->name, data->name);
    if (ds->ds_num != data->values_len)
    {
      ERROR ("snmp plugin: DataSet `%s' requires %i values, but config talks about %i",
-       data->type, ds->ds_num, data->values_len);
+         data->type, ds->ds_num, data->values_len);
      return (-1);
    }
  
    else
      oid_list_len--;
  
-   /* Allocate the `value_table' */
-   value_table = (csnmp_table_values_t **) malloc (sizeof (csnmp_table_values_t *)
-       * 2 * data->values_len);
-   if (value_table == NULL)
+   /* We're going to construct n linked lists, one for each "value".
+    * value_list_head will contain pointers to the heads of these linked lists,
+    * value_list_tail will contain pointers to the tail of the lists. */
+   value_list_head = calloc (data->values_len, sizeof (*value_list_head));
+   value_list_tail = calloc (data->values_len, sizeof (*value_list_tail));
+   if ((value_list_head == NULL) || (value_list_tail == NULL))
    {
-     ERROR ("snmp plugin: csnmp_read_table: malloc failed.");
+     ERROR ("snmp plugin: csnmp_read_table: calloc failed.");
      sfree (oid_list);
+     sfree (value_list_head);
+     sfree (value_list_tail);
      return (-1);
    }
-   memset (value_table, '\0', sizeof (csnmp_table_values_t *) * 2 * data->values_len);
-   value_table_ptr = value_table + data->values_len;
-   
-   instance_list = NULL;
-   instance_list_ptr = NULL;
+   instance_list_head = NULL;
+   instance_list_tail = NULL;
  
    status = 0;
    while (status == 0)
        snmp_sess_error (host->sess_handle, NULL, NULL, &errstr);
  
        c_complain (LOG_ERR, &host->complaint,
-         "snmp plugin: host %s: snmp_sess_synch_response failed: %s",
-         host->name, (errstr == NULL) ? "Unknown problem" : errstr);
+           "snmp plugin: host %s: snmp_sess_synch_response failed: %s",
+           host->name, (errstr == NULL) ? "Unknown problem" : errstr);
  
        if (res != NULL)
-       snmp_free_pdu (res);
+         snmp_free_pdu (res);
        res = NULL;
  
        sfree (errstr);
      status = 0;
      assert (res != NULL);
      c_release (LOG_INFO, &host->complaint,
-       "snmp plugin: host %s: snmp_sess_synch_response successful.",
-       host->name);
+         "snmp plugin: host %s: snmp_sess_synch_response successful.",
+         host->name);
  
      vb = res->variables;
      if (vb == NULL)
        break;
      }
  
-     /* if an instance-OID is configured.. */
+     /* Copy the OID of the value used as instance to oid_list, if an instance
+      * is configured. */
      if (data->instance.oid.oid_len > 0)
      {
        /* Allocate a new `csnmp_list_instances_t', insert the instance name and
         * add it to the list */
-       if (csnmp_instance_list_add (&instance_list, &instance_list_ptr,
+       if (csnmp_instance_list_add (&instance_list_head, &instance_list_tail,
 -            res, &data->instance.oid) != 0)
 +          res, host, data) != 0)
        {
-       ERROR ("snmp plugin: csnmp_instance_list_add failed.");
-       status = -1;
-       break;
+         ERROR ("snmp plugin: csnmp_instance_list_add failed.");
+         status = -1;
+         break;
        }
  
-       /* Set vb on the last variable */
+       /* The instance OID is added to the list of OIDs to GET from the
+        * snmp agent last, so set vb on the last variable returned and copy
+        * that OID. */
        for (vb = res->variables;
-         (vb != NULL) && (vb->next_variable != NULL);
-         vb = vb->next_variable)
-       /* do nothing */;
+           (vb != NULL) && (vb->next_variable != NULL);
+           vb = vb->next_variable)
+         /* do nothing */;
        assert (vb != NULL);
  
-       /* Copy OID to oid_list[data->values_len] */
+       /* Copy the OID of the instance value to oid_list[data->values_len].
+        * "oid_list" is used for the next GETNEXT request. */
        memcpy (oid_list[data->values_len].oid, vb->name,
-         sizeof (oid) * vb->name_length);
+           sizeof (oid) * vb->name_length);
        oid_list[data->values_len].oid_len = vb->name_length;
      }
  
+     /* Iterate over all the (non-instance) values returned by the agent. The
+      * (i < value_len) check will make sure we're not handling the instance OID
+      * twice. */
      for (vb = res->variables, i = 0;
-       (vb != NULL) && (i < data->values_len);
-       vb = vb->next_variable, i++)
+         (vb != NULL) && (i < data->values_len);
+         vb = vb->next_variable, i++)
      {
        csnmp_table_values_t *vt;
+       oid_t vb_name;
+       oid_t suffix;
  
-       /* Check if we left the subtree */
-       if (snmp_oid_ncompare (data->values[i].oid,
-           data->values[i].oid_len,
-           vb->name, vb->name_length,
-           data->values[i].oid_len) != 0)
+       csnmp_oid_init (&vb_name, vb->name, vb->name_length);
+       /* Calculate the current suffix. This is later used to check that the
+        * suffix is increasing. This also checks if we left the subtree */
+       status = csnmp_oid_suffix (&suffix, &vb_name, data->values + i);
+       if (status != 0)
        {
-       DEBUG ("snmp plugin: host = %s; data = %s; Value %i left its subtree.",
-           host->name, data->name, i);
-       continue;
+         DEBUG ("snmp plugin: host = %s; data = %s; Value %i failed. "
+             "It probably left its subtree.",
+             host->name, data->name, i);
+         continue;
        }
  
-       if ((value_table_ptr[i] != NULL)
-         && (vb->name[vb->name_length - 1] <= value_table_ptr[i]->subid))
+       /* Make sure the OIDs returned by the agent are increasing. Otherwise our
+        * table matching algorithm will get confused. */
+       if ((value_list_tail[i] != NULL)
+           && (csnmp_oid_compare (&suffix, &value_list_tail[i]->suffix) <= 0))
        {
-       DEBUG ("snmp plugin: host = %s; data = %s; i = %i; "
-           "SUBID is not increasing.",
-           host->name, data->name, i);
-       continue;
+         DEBUG ("snmp plugin: host = %s; data = %s; i = %i; "
+             "Suffix is not increasing.",
+             host->name, data->name, i);
+         continue;
        }
  
-       vt = (csnmp_table_values_t *) malloc (sizeof (csnmp_table_values_t));
+       vt = malloc (sizeof (*vt));
        if (vt == NULL)
        {
-       ERROR ("snmp plugin: malloc failed.");
-       status = -1;
-       break;
+         ERROR ("snmp plugin: malloc failed.");
+         status = -1;
+         break;
        }
+       memset (vt, 0, sizeof (*vt));
  
-       vt->subid = vb->name[vb->name_length - 1];
        vt->value = csnmp_value_list_to_value (vb, ds->ds[i].type,
 -          data->scale, data->shift);
 +          data->scale, data->shift, host->name, data->name);
+       memcpy (&vt->suffix, &suffix, sizeof (vt->suffix));
        vt->next = NULL;
  
-       if (value_table_ptr[i] == NULL)
-       value_table[i] = vt;
+       if (value_list_tail[i] == NULL)
+         value_list_head[i] = vt;
        else
-       value_table_ptr[i]->next = vt;
-       value_table_ptr[i] = vt;
+         value_list_tail[i]->next = vt;
+       value_list_tail[i] = vt;
  
        /* Copy OID to oid_list[i + 1] */
        memcpy (oid_list[i].oid, vb->name, sizeof (oid) * vb->name_length);
    res = NULL;
  
    if (status == 0)
-     csnmp_dispatch_table (host, data, instance_list, value_table);
+     csnmp_dispatch_table (host, data, instance_list_head, value_list_head);
  
    /* Free all allocated variables here */
-   while (instance_list != NULL)
+   while (instance_list_head != NULL)
    {
-     instance_list_ptr = instance_list->next;
-     sfree (instance_list);
-     instance_list = instance_list_ptr;
+     csnmp_list_instances_t *next = instance_list_head->next;
+     sfree (instance_list_head);
+     instance_list_head = next;
    }
  
    for (i = 0; i < data->values_len; i++)
    {
-     csnmp_table_values_t *tmp;
-     while (value_table[i] != NULL)
+     while (value_list_head[i] != NULL)
      {
-       tmp = value_table[i]->next;
-       sfree (value_table[i]);
-       value_table[i] = tmp;
+       csnmp_table_values_t *next = value_list_head[i]->next;
+       sfree (value_list_head[i]);
+       value_list_head[i] = next;
      }
    }
  
-   sfree (value_table);
+   sfree (value_list_head);
+   sfree (value_list_tail);
    sfree (oid_list);
  
    return (0);
@@@ -1449,7 -1543,7 +1548,7 @@@ static int csnmp_read_value (host_defin
    if (ds->ds_num != data->values_len)
    {
      ERROR ("snmp plugin: DataSet `%s' requires %i values, but config talks about %i",
-       data->type, ds->ds_num, data->values_len);
+         data->type, ds->ds_num, data->values_len);
      return (-1);
    }
  
  
      snmp_sess_error (host->sess_handle, NULL, NULL, &errstr);
      ERROR ("snmp plugin: host %s: snmp_sess_synch_response failed: %s",
-       host->name, (errstr == NULL) ? "Unknown problem" : errstr);
+         host->name, (errstr == NULL) ? "Unknown problem" : errstr);
  
      if (res != NULL)
        snmp_free_pdu (res);
  #if COLLECT_DEBUG
      char buffer[1024];
      snprint_variable (buffer, sizeof (buffer),
-       vb->name, vb->name_length, vb);
+         vb->name, vb->name_length, vb);
      DEBUG ("snmp plugin: Got this variable: %s", buffer);
  #endif /* COLLECT_DEBUG */
  
      for (i = 0; i < data->values_len; i++)
        if (snmp_oid_compare (data->values[i].oid, data->values[i].oid_len,
-           vb->name, vb->name_length) == 0)
+             vb->name, vb->name_length) == 0)
          vl.values[i] = csnmp_value_list_to_value (vb, ds->ds[i].type,
 -            data->scale, data->shift);
 +            data->scale, data->shift, host->name, data->name);
    } /* for (res->variables) */
  
    if (res != NULL)