Merge branch 'ssnprintf-cleanup'
authorRuben Kerkhof <ruben@rubenkerkhof.com>
Sun, 16 Jul 2017 20:33:21 +0000 (22:33 +0200)
committerRuben Kerkhof <ruben@rubenkerkhof.com>
Sun, 16 Jul 2017 20:33:21 +0000 (22:33 +0200)
Conflicts:
src/dpdkevents.c
src/utils_dpdk.c
src/write_mongodb.c

13 files changed:
1  2 
src/apache.c
src/ascent.c
src/bind.c
src/curl.c
src/curl_json.c
src/curl_xml.c
src/dpdkevents.c
src/dpdkstat.c
src/nginx.c
src/snmp_agent.c
src/utils_dpdk.c
src/write_http.c
src/write_mongodb.c

diff --combined src/apache.c
@@@ -219,17 -219,18 +219,18 @@@ static int config_add(oconfig_item_t *c
    if (status == 0) {
      char callback_name[3 * DATA_MAX_NAME_LEN];
  
-     ssnprintf(callback_name, sizeof(callback_name), "apache/%s/%s",
-               (st->host != NULL) ? st->host : hostname_g,
-               (st->name != NULL) ? st->name : "default");
+     snprintf(callback_name, sizeof(callback_name), "apache/%s/%s",
+              (st->host != NULL) ? st->host : hostname_g,
+              (st->name != NULL) ? st->name : "default");
  
      status = plugin_register_complex_read(
          /* group = */ NULL,
          /* name      = */ callback_name,
          /* callback  = */ apache_read_host,
-         /* interval  = */ 0, &(user_data_t){
-                                  .data = st, .free_func = apache_free,
-                              });
+         /* interval  = */ 0,
+         &(user_data_t){
+             .data = st, .free_func = apache_free,
+         });
    }
  
    if (status != 0) {
@@@ -313,8 -314,8 +314,8 @@@ static int init_host(apache_t *st) /* {
      static char credentials[1024];
      int status;
  
-     status = ssnprintf(credentials, sizeof(credentials), "%s:%s", st->user,
-                        (st->pass == NULL) ? "" : st->pass);
+     status = snprintf(credentials, sizeof(credentials), "%s:%s", st->user,
+                       (st->pass == NULL) ? "" : st->pass);
      if ((status < 0) || ((size_t)status >= sizeof(credentials))) {
        ERROR("apache plugin: init_host: Returning an error "
              "because the credentials have been "
  #endif
    }
  
 -  curl_easy_setopt(st->curl, CURLOPT_URL, st->url);
    curl_easy_setopt(st->curl, CURLOPT_FOLLOWLOCATION, 1L);
    curl_easy_setopt(st->curl, CURLOPT_MAXREDIRS, 50L);
  
@@@ -509,9 -511,6 +510,9 @@@ static int apache_read_host(user_data_
    assert(st->curl != NULL);
  
    st->apache_buffer_fill = 0;
 +
 +  curl_easy_setopt(st->curl, CURLOPT_URL, st->url);
 +
    if (curl_easy_perform(st->curl) != CURLE_OK) {
      ERROR("apache: curl_easy_perform failed: %s", st->apache_curl_error);
      return -1;
diff --combined src/ascent.c
@@@ -499,8 -499,8 +499,8 @@@ static int ascent_init(void) /* {{{ *
      static char credentials[1024];
      int status;
  
-     status = ssnprintf(credentials, sizeof(credentials), "%s:%s", user,
-                        (pass == NULL) ? "" : pass);
+     status = snprintf(credentials, sizeof(credentials), "%s:%s", user,
+                       (pass == NULL) ? "" : pass);
      if ((status < 0) || ((size_t)status >= sizeof(credentials))) {
        ERROR("ascent plugin: ascent_init: Returning an error because the "
              "credentials have been truncated.");
  #endif
    }
  
 -  curl_easy_setopt(curl, CURLOPT_URL, url);
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
    curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 50L);
  
@@@ -553,9 -554,6 +553,9 @@@ static int ascent_read(void) /* {{{ *
    }
  
    ascent_buffer_fill = 0;
 +
 +  curl_easy_setopt(curl, CURLOPT_URL, url);
 +
    if (curl_easy_perform(curl) != CURLE_OK) {
      ERROR("ascent plugin: curl_easy_perform failed: %s", ascent_curl_error);
      return -1;
diff --combined src/bind.c
@@@ -737,8 -737,8 +737,8 @@@ static int bind_xml_stats_handle_zone(i
                                           nsstats_translation_table_length,
                                           plugin_instance};
  
-     ssnprintf(plugin_instance, sizeof(plugin_instance), "%s-zone-%s",
-               view->name, zone_name);
+     snprintf(plugin_instance, sizeof(plugin_instance), "%s-zone-%s", view->name,
+              zone_name);
  
      if (version == 3) {
        list_info_ptr_t list_info = {plugin_instance,
@@@ -868,8 -868,7 +868,7 @@@ static int bind_xml_stats_handle_view(i
      list_info_ptr_t list_info = {plugin_instance,
                                   /* type = */ "dns_qtype"};
  
-     ssnprintf(plugin_instance, sizeof(plugin_instance), "%s-qtypes",
-               view->name);
+     snprintf(plugin_instance, sizeof(plugin_instance), "%s-qtypes", view->name);
      if (version == 3) {
        bind_parse_generic_name_attr_value_list(
            /* xpath = */ "counters[@type='resqtype']",
                                           resstats_translation_table_length,
                                           plugin_instance};
  
-     ssnprintf(plugin_instance, sizeof(plugin_instance), "%s-resolver_stats",
-               view->name);
+     snprintf(plugin_instance, sizeof(plugin_instance), "%s-resolver_stats",
+              view->name);
      if (version == 3) {
        bind_parse_generic_name_attr_value_list(
            "counters[@type='resstats']",
      list_info_ptr_t list_info = {plugin_instance,
                                   /* type = */ "dns_qtype_cached"};
  
-     ssnprintf(plugin_instance, sizeof(plugin_instance), "%s-cache_rr_sets",
-               view->name);
+     snprintf(plugin_instance, sizeof(plugin_instance), "%s-cache_rr_sets",
+              view->name);
  
      bind_parse_generic_name_value(/* xpath = */ "cache/rrset",
                                    /* callback = */ bind_xml_list_callback,
@@@ -1598,6 -1597,7 +1597,6 @@@ static int bind_init(void) /* {{{ *
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, bind_curl_callback);
    curl_easy_setopt(curl, CURLOPT_USERAGENT, COLLECTD_USERAGENT);
    curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, bind_curl_error);
 -  curl_easy_setopt(curl, CURLOPT_URL, (url != NULL) ? url : BIND_DEFAULT_URL);
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
    curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 50L);
  #ifdef HAVE_CURLOPT_TIMEOUT_MS
@@@ -1619,9 -1619,6 +1618,9 @@@ static int bind_read(void) /* {{{ *
    }
  
    bind_buffer_fill = 0;
 +
 +  curl_easy_setopt(curl, CURLOPT_URL, (url != NULL) ? url : BIND_DEFAULT_URL);
 +
    if (curl_easy_perform(curl) != CURLE_OK) {
      ERROR("bind plugin: curl_easy_perform failed: %s", bind_curl_error);
      return -1;
diff --combined src/curl.c
@@@ -347,6 -347,7 +347,6 @@@ static int cc_page_init_curl(web_page_
    curl_easy_setopt(wp->curl, CURLOPT_WRITEDATA, wp);
    curl_easy_setopt(wp->curl, CURLOPT_USERAGENT, COLLECTD_USERAGENT);
    curl_easy_setopt(wp->curl, CURLOPT_ERRORBUFFER, wp->curl_errbuf);
 -  curl_easy_setopt(wp->curl, CURLOPT_URL, wp->url);
    curl_easy_setopt(wp->curl, CURLOPT_FOLLOWLOCATION, 1L);
    curl_easy_setopt(wp->curl, CURLOPT_MAXREDIRS, 50L);
  
        return -1;
      }
  
-     ssnprintf(wp->credentials, credentials_size, "%s:%s", wp->user,
-               (wp->pass == NULL) ? "" : wp->pass);
+     snprintf(wp->credentials, credentials_size, "%s:%s", wp->user,
+              (wp->pass == NULL) ? "" : wp->pass);
      curl_easy_setopt(wp->curl, CURLOPT_USERPWD, wp->credentials);
  #endif
  
@@@ -610,9 -611,6 +610,9 @@@ static int cc_read_page(web_page_t *wp
      start = cdtime();
  
    wp->buffer_fill = 0;
 +
 +  curl_easy_setopt(wp->curl, CURLOPT_URL, wp->url);
 +
    status = curl_easy_perform(wp->curl);
    if (status != CURLE_OK) {
      ERROR("curl plugin: curl_easy_perform failed with status %i: %s", status,
diff --combined src/curl_json.c
@@@ -217,7 -217,7 +217,7 @@@ static void cj_advance_array(cj_t *db) 
    db->state[db->depth].index++;
  
    char name[DATA_MAX_NAME_LEN];
-   ssnprintf(name, sizeof(name), "%d", db->state[db->depth].index);
+   snprintf(name, sizeof(name), "%d", db->state[db->depth].index);
    cj_load_key(db, name);
  }
  
@@@ -578,6 -578,7 +578,6 @@@ static int cj_init_curl(cj_t *db) /* {{
    curl_easy_setopt(db->curl, CURLOPT_WRITEDATA, db);
    curl_easy_setopt(db->curl, CURLOPT_USERAGENT, COLLECTD_USERAGENT);
    curl_easy_setopt(db->curl, CURLOPT_ERRORBUFFER, db->curl_errbuf);
 -  curl_easy_setopt(db->curl, CURLOPT_URL, db->url);
    curl_easy_setopt(db->curl, CURLOPT_FOLLOWLOCATION, 1L);
    curl_easy_setopt(db->curl, CURLOPT_MAXREDIRS, 50L);
  
        return -1;
      }
  
-     ssnprintf(db->credentials, credentials_size, "%s:%s", db->user,
-               (db->pass == NULL) ? "" : db->pass);
+     snprintf(db->credentials, credentials_size, "%s:%s", db->user,
+              (db->pass == NULL) ? "" : db->pass);
      curl_easy_setopt(db->curl, CURLOPT_USERPWD, db->credentials);
  #endif
  
@@@ -799,8 -800,8 +799,8 @@@ static void cj_submit_impl(cj_t *db, cj
    if (key->instance == NULL) {
      int len = 0;
      for (int i = 0; i < db->depth; i++)
-       len += ssnprintf(vl.type_instance + len, sizeof(vl.type_instance) - len,
-                        i ? "-%s" : "%s", db->state[i + 1].name);
+       len += snprintf(vl.type_instance + len, sizeof(vl.type_instance) - len,
+                       i ? "-%s" : "%s", db->state[i + 1].name);
    } else
      sstrncpy(vl.type_instance, key->instance, sizeof(vl.type_instance));
  
@@@ -857,13 -858,12 +857,13 @@@ static int cj_curl_perform(cj_t *db) /
    int status;
    long rc;
    char *url;
 -  url = db->url;
 +
 +  curl_easy_setopt(db->curl, CURLOPT_URL, db->url);
  
    status = curl_easy_perform(db->curl);
    if (status != CURLE_OK) {
      ERROR("curl_json plugin: curl_easy_perform failed with status %i: %s (%s)",
 -          status, db->curl_errbuf, url);
 +          status, db->curl_errbuf, db->url);
      return -1;
    }
    if (db->stats != NULL)
diff --combined src/curl_xml.c
@@@ -369,7 -369,7 +369,7 @@@ static int cx_handle_all_value_xpaths(x
      status = cx_handle_single_value_xpath(xpath_ctx, xpath, ds, vl, i);
      if (status != 0)
        return -1; /* An error has been printed. */
-   }                /* for (i = 0; i < xpath->values_len; i++) */
+   }              /* for (i = 0; i < xpath->values_len; i++) */
  
    plugin_dispatch_values(vl);
    vl->values = NULL;
@@@ -441,8 -441,8 +441,8 @@@ static int cx_handle_instance_xpath(xml
    if (xpath->instance_prefix != NULL) {
      if (instance_node != NULL) {
        char *node_value = (char *)xmlNodeGetContent(instance_node->nodeTab[0]);
-       ssnprintf(vl->type_instance, sizeof(vl->type_instance), "%s%s",
-                 xpath->instance_prefix, node_value);
+       snprintf(vl->type_instance, sizeof(vl->type_instance), "%s%s",
+                xpath->instance_prefix, node_value);
        sfree(node_value);
      } else
        sstrncpy(vl->type_instance, xpath->instance_prefix,
@@@ -602,15 -602,13 +602,15 @@@ static int cx_curl_perform(cx_t *db, CU
    long rc;
    char *ptr;
    char *url;
 -  url = db->url;
  
    db->buffer_fill = 0;
 +
 +  curl_easy_setopt(db->curl, CURLOPT_URL, db->url);
 +
    status = curl_easy_perform(curl);
    if (status != CURLE_OK) {
      ERROR("curl_xml plugin: curl_easy_perform failed with status %i: %s (%s)",
 -          status, db->curl_errbuf, url);
 +          status, db->curl_errbuf, db->url);
      return -1;
    }
    if (db->stats != NULL)
@@@ -819,6 -817,7 +819,6 @@@ static int cx_init_curl(cx_t *db) /* {{
    curl_easy_setopt(db->curl, CURLOPT_WRITEDATA, db);
    curl_easy_setopt(db->curl, CURLOPT_USERAGENT, COLLECTD_USERAGENT);
    curl_easy_setopt(db->curl, CURLOPT_ERRORBUFFER, db->curl_errbuf);
 -  curl_easy_setopt(db->curl, CURLOPT_URL, db->url);
    curl_easy_setopt(db->curl, CURLOPT_FOLLOWLOCATION, 1L);
    curl_easy_setopt(db->curl, CURLOPT_MAXREDIRS, 50L);
  
        return -1;
      }
  
-     ssnprintf(db->credentials, credentials_size, "%s:%s", db->user,
-               (db->pass == NULL) ? "" : db->pass);
+     snprintf(db->credentials, credentials_size, "%s:%s", db->user,
+              (db->pass == NULL) ? "" : db->pass);
      curl_easy_setopt(db->curl, CURLOPT_USERPWD, db->credentials);
  #endif
  
diff --combined src/dpdkevents.c
@@@ -66,20 -66,19 +66,20 @@@ typedef struct dpdk_ka_monitor_s 
  
  typedef struct dpdk_link_status_config_s {
    int enabled;
 -  int send_updated;
 +  _Bool send_updated;
    uint32_t enabled_port_mask;
    char port_name[RTE_MAX_ETHPORTS][DATA_MAX_NAME_LEN];
 -  int notify;
 +  _Bool notify;
  } dpdk_link_status_config_t;
  
  typedef struct dpdk_keep_alive_config_s {
    int enabled;
 -  int send_updated;
 +  _Bool send_updated;
    uint128_t lcore_mask;
    dpdk_keepalive_shm_t *shm;
    char shm_name[DATA_MAX_NAME_LEN];
 -  int notify;
 +  _Bool notify;
 +  int fd;
  } dpdk_keep_alive_config_t;
  
  typedef struct dpdk_events_config_s {
@@@ -101,22 -100,14 +101,22 @@@ typedef struct dpdk_events_ctx_s 
    dpdk_ka_monitor_t core_info[RTE_KEEPALIVE_MAXCORES];
  } dpdk_events_ctx_t;
  
 +typedef enum {
 +  DPDK_EVENTS_STATE_CFG_ERR = 1 << 0,
 +  DPDK_EVENTS_STATE_KA_CFG_ERR = 1 << 1,
 +  DPDK_EVENTS_STATE_LS_CFG_ERR = 1 << 2,
 +
 +} dpdk_events_cfg_status;
 +
  #define DPDK_EVENTS_CTX_GET(a) ((dpdk_events_ctx_t *)dpdk_helper_priv_get(a))
  
  #define DPDK_EVENTS_TRACE()                                                    \
    DEBUG("%s:%s:%d pid=%u", DPDK_EVENTS_PLUGIN, __FUNCTION__, __LINE__, getpid())
  
  static dpdk_helper_ctx_t *g_hc;
 +static dpdk_events_cfg_status g_state;
  
 -static int dpdk_event_keep_alive_shm_create(void) {
 +static int dpdk_event_keep_alive_shm_open(void) {
    dpdk_events_ctx_t *ec = DPDK_EVENTS_CTX_GET(g_hc);
    char *shm_name;
  
    }
  
    char errbuf[ERR_BUF_SIZE];
 -  int fd = shm_open(shm_name, O_RDWR, 0);
 +  int fd = shm_open(shm_name, O_RDONLY, 0);
    if (fd < 0) {
      ERROR(DPDK_EVENTS_PLUGIN ": Failed to open %s as SHM:%s. Is DPDK KA "
                               "primary application running?",
            shm_name, sstrerror(errno, errbuf, sizeof(errbuf)));
      return errno;
 -  } else {
 -    ec->config.keep_alive.shm =
 -        (dpdk_keepalive_shm_t *)mmap(0, sizeof(*(ec->config.keep_alive.shm)),
 -                                     PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
 -    close(fd);
 -    if (ec->config.keep_alive.shm == MAP_FAILED) {
 -      ERROR(DPDK_EVENTS_PLUGIN ": Failed to mmap KA SHM:%s",
 -            sstrerror(errno, errbuf, sizeof(errbuf)));
 -      return errno;
 +  }
 +
 +  if (ec->config.keep_alive.fd != -1) {
 +    struct stat stat_old, stat_new;
 +
 +    if (fstat(ec->config.keep_alive.fd, &stat_old) || fstat(fd, &stat_new)) {
 +      ERROR(DPDK_EVENTS_PLUGIN ": failed to get information about a file");
 +      close(fd);
 +      return -1;
 +    }
 +
 +    /* Check if inode number has changed. If yes, then create a new mapping */
 +    if (stat_old.st_ino == stat_new.st_ino) {
 +      close(fd);
 +      return 0;
 +    }
 +
 +    if (munmap(ec->config.keep_alive.shm, sizeof(dpdk_keepalive_shm_t)) != 0) {
 +      ERROR(DPDK_EVENTS_PLUGIN ": munmap KA monitor failed");
 +      close(fd);
 +      return -1;
      }
 +
 +    close(ec->config.keep_alive.fd);
 +    ec->config.keep_alive.fd = -1;
 +  }
 +
 +  ec->config.keep_alive.shm = (dpdk_keepalive_shm_t *)mmap(
 +      0, sizeof(*(ec->config.keep_alive.shm)), PROT_READ, MAP_SHARED, fd, 0);
 +  if (ec->config.keep_alive.shm == MAP_FAILED) {
 +    ERROR(DPDK_EVENTS_PLUGIN ": Failed to mmap KA SHM:%s",
 +          sstrerror(errno, errbuf, sizeof(errbuf)));
 +    close(fd);
 +    return errno;
    }
 +  ec->config.keep_alive.fd = fd;
  
    return 0;
  }
@@@ -181,11 -147,8 +181,11 @@@ static void dpdk_events_default_config(
  
    ec->config.interval = plugin_get_interval();
  
 +  /* In configless mode when no <Plugin/> section is defined in config file
 +   * both link_status and keep_alive should be enabled */
 +
    /* Link Status */
 -  ec->config.link_status.enabled = 0;
 +  ec->config.link_status.enabled = 1;
    ec->config.link_status.enabled_port_mask = ~0;
    ec->config.link_status.send_updated = 1;
    ec->config.link_status.notify = 0;
    }
  
    /* Keep Alive */
 -  ec->config.keep_alive.enabled = 0;
 +  ec->config.keep_alive.enabled = 1;
    ec->config.keep_alive.send_updated = 1;
    ec->config.keep_alive.notify = 0;
 -  memset(&ec->config.keep_alive.lcore_mask, 0,
 +  /* by default enable 128 cores */
 +  memset(&ec->config.keep_alive.lcore_mask, 1,
           sizeof(ec->config.keep_alive.lcore_mask));
    memset(&ec->config.keep_alive.shm_name, 0,
           sizeof(ec->config.keep_alive.shm_name));
 +  ec->config.keep_alive.shm = MAP_FAILED;
 +  ec->config.keep_alive.fd = -1;
  }
  
  static int dpdk_events_preinit(void) {
@@@ -248,26 -208,18 +248,26 @@@ static int dpdk_events_link_status_conf
      oconfig_item_t *child = ci->children + i;
  
      if (strcasecmp("EnabledPortMask", child->key) == 0) {
 -      ec->config.link_status.enabled_port_mask =
 -          (uint32_t)child->values[0].value.number;
 +      if (cf_util_get_int(child,
 +                          (int *)&ec->config.link_status.enabled_port_mask))
 +        return -1;
        DEBUG(DPDK_EVENTS_PLUGIN ": LinkStatus:Enabled Port Mask 0x%X",
              ec->config.link_status.enabled_port_mask);
      } else if (strcasecmp("SendEventsOnUpdate", child->key) == 0) {
 -      ec->config.link_status.send_updated = child->values[0].value.boolean;
 +      if (cf_util_get_boolean(child, &ec->config.link_status.send_updated))
 +        return -1;
        DEBUG(DPDK_EVENTS_PLUGIN ": LinkStatus:SendEventsOnUpdate %d",
 -            (int)child->values[0].value.boolean);
 +            ec->config.link_status.send_updated);
      } else if (strcasecmp("SendNotification", child->key) == 0) {
 -      ec->config.link_status.notify = child->values[0].value.boolean;
 +      if (cf_util_get_boolean(child, &ec->config.link_status.notify))
 +        return -1;
 +
        DEBUG(DPDK_EVENTS_PLUGIN ": LinkStatus:SendNotification %d",
 -            (int)child->values[0].value.boolean);
 +            ec->config.link_status.notify);
 +    } else if (strcasecmp("PortName", child->key) != 0) {
 +      ERROR(DPDK_EVENTS_PLUGIN ": unrecognized configuration option %s.",
 +            child->key);
 +      return -1;
      }
    }
  
      if (strcasecmp("PortName", child->key) == 0) {
        while (!(ec->config.link_status.enabled_port_mask & (1 << port_num)))
          port_num++;
 -      snprintf(ec->config.link_status.port_name[port_num], DATA_MAX_NAME_LEN,
 -               "%s", child->values[0].value.string);
 +
 +      if (cf_util_get_string_buffer(
 +              child, ec->config.link_status.port_name[port_num],
 +              sizeof(ec->config.link_status.port_name[port_num]))) {
 +        return -1;
 +      }
        DEBUG(DPDK_EVENTS_PLUGIN ": LinkStatus:Port %d Name: %s", port_num,
              ec->config.link_status.port_name[port_num]);
        port_num++;
@@@ -303,38 -251,28 +303,38 @@@ static int dpdk_events_keep_alive_confi
      oconfig_item_t *child = ci->children + i;
  
      if (strcasecmp("SendEventsOnUpdate", child->key) == 0) {
 -      ec->config.keep_alive.send_updated = child->values[0].value.boolean;
 +      if (cf_util_get_boolean(child, &ec->config.keep_alive.send_updated))
 +        return -1;
 +
        DEBUG(DPDK_EVENTS_PLUGIN ": KeepAlive:SendEventsOnUpdate %d",
 -            (int)child->values[0].value.boolean);
 +            ec->config.keep_alive.send_updated);
      } else if (strcasecmp("LCoreMask", child->key) == 0) {
        char lcore_mask[DATA_MAX_NAME_LEN];
 -      snprintf(lcore_mask, sizeof(lcore_mask), "%s",
 -               child->values[0].value.string);
 +
 +      if (cf_util_get_string_buffer(child, lcore_mask, sizeof(lcore_mask)))
 +        return -1;
        ec->config.keep_alive.lcore_mask =
            str_to_uint128(lcore_mask, strlen(lcore_mask));
        DEBUG(DPDK_EVENTS_PLUGIN ": KeepAlive:LCoreMask 0x%" PRIX64 "%" PRIX64 "",
              ec->config.keep_alive.lcore_mask.high,
              ec->config.keep_alive.lcore_mask.low);
      } else if (strcasecmp("KeepAliveShmName", child->key) == 0) {
 -      snprintf(ec->config.keep_alive.shm_name,
 -               sizeof(ec->config.keep_alive.shm_name), "%s",
 -               child->values[0].value.string);
 +      if (cf_util_get_string_buffer(child, ec->config.keep_alive.shm_name,
 +                                    sizeof(ec->config.keep_alive.shm_name)))
 +        return -1;
 +
        DEBUG(DPDK_EVENTS_PLUGIN ": KeepAlive:KeepAliveShmName %s",
              ec->config.keep_alive.shm_name);
      } else if (strcasecmp("SendNotification", child->key) == 0) {
 -      ec->config.keep_alive.notify = child->values[0].value.boolean;
 +      if (cf_util_get_boolean(child, &ec->config.keep_alive.notify))
 +        return -1;
 +
        DEBUG(DPDK_EVENTS_PLUGIN ": KeepAlive:SendNotification %d",
 -            (int)child->values[0].value.boolean);
 +            ec->config.keep_alive.notify);
 +    } else {
 +      ERROR(DPDK_EVENTS_PLUGIN ": unrecognized configuration option %s.",
 +            child->key);
 +      return -1;
      }
    }
  
  
  static int dpdk_events_config(oconfig_item_t *ci) {
    DPDK_EVENTS_TRACE();
 -
    int ret = dpdk_events_preinit();
 -  if (ret)
 -    return ret;
 +  if (ret) {
 +    g_state |= DPDK_EVENTS_STATE_CFG_ERR;
 +    return 0;
 +  }
  
    dpdk_events_ctx_t *ec = DPDK_EVENTS_CTX_GET(g_hc);
  
 +  /* Disabling link_status and keep_alive since <Plugin/> config section
 +   * specifies if those should be enabled */
 +  ec->config.keep_alive.enabled = ec->config.link_status.enabled = 0;
 +  memset(&ec->config.keep_alive.lcore_mask, 0,
 +         sizeof(ec->config.keep_alive.lcore_mask));
 +
    for (int i = 0; i < ci->children_num; i++) {
      oconfig_item_t *child = ci->children + i;
 -    if (strcasecmp("EAL", child->key) == 0) {
 -      dpdk_helper_eal_config_parse(g_hc, child);
 -    } else if (strcasecmp("Event", child->key) == 0) {
 -      if (strcasecmp(child->values[0].value.string, "link_status") == 0) {
 -        dpdk_events_link_status_config(ec, child);
 -      } else if (strcasecmp(child->values[0].value.string, "keep_alive") == 0) {
 -        dpdk_events_keep_alive_config(ec, child);
 +
 +    if (strcasecmp("EAL", child->key) == 0)
 +      ret = dpdk_helper_eal_config_parse(g_hc, child);
 +    else if (strcasecmp("Event", child->key) == 0) {
 +      char event_type[DATA_MAX_NAME_LEN];
 +
 +      if (cf_util_get_string_buffer(child, event_type, sizeof(event_type)))
 +        ret = -1;
 +      else if (strcasecmp(event_type, "link_status") == 0) {
 +        ret = dpdk_events_link_status_config(ec, child);
 +        if (ret) {
 +          g_state |= DPDK_EVENTS_STATE_LS_CFG_ERR;
 +          continue;
 +        }
 +      } else if (strcasecmp(event_type, "keep_alive") == 0) {
 +        ret = dpdk_events_keep_alive_config(ec, child);
 +        if (ret) {
 +          g_state |= DPDK_EVENTS_STATE_KA_CFG_ERR;
 +          continue;
 +        }
        } else {
          ERROR(DPDK_EVENTS_PLUGIN ": The selected event \"%s\" is unknown.",
 -              child->values[0].value.string);
 +              event_type);
 +        ret = -1;
        }
 +    } else {
 +      ERROR(DPDK_EVENTS_PLUGIN ": unrecognized configuration option %s.",
 +            child->key);
 +      ret = -1;
 +    }
 +
 +    if (ret != 0) {
 +      g_state |= DPDK_EVENTS_STATE_CFG_ERR;
 +      return 0;
      }
    }
  
 +  if (g_state & DPDK_EVENTS_STATE_KA_CFG_ERR) {
 +    ERROR(DPDK_EVENTS_PLUGIN
 +          ": Invalid keep alive configuration. Event disabled.");
 +    ec->config.keep_alive.enabled = 0;
 +  }
 +
 +  if (g_state & DPDK_EVENTS_STATE_LS_CFG_ERR) {
 +    ERROR(DPDK_EVENTS_PLUGIN
 +          ": Invalid link status configuration. Event disabled.");
 +    ec->config.link_status.enabled = 0;
 +  }
 +
    if (!ec->config.keep_alive.enabled && !ec->config.link_status.enabled) {
      ERROR(DPDK_EVENTS_PLUGIN ": At least one type of events should be "
                               "configured for collecting. Plugin misconfigured");
 -    return -1;
 +    g_state |= DPDK_EVENTS_STATE_CFG_ERR;
 +    return 0;
    }
  
 -  return ret;
 +  return 0;
  }
  
  static int dpdk_helper_link_status_get(dpdk_helper_ctx_t *phc) {
@@@ -510,17 -405,17 +510,17 @@@ static int dpdk_events_link_status_disp
  
          char dev_name[DATA_MAX_NAME_LEN];
          if (ec->config.link_status.port_name[i][0] != 0) {
-           ssnprintf(dev_name, sizeof(dev_name), "%s",
-                     ec->config.link_status.port_name[i]);
+           snprintf(dev_name, sizeof(dev_name), "%s",
+                    ec->config.link_status.port_name[i]);
          } else {
-           ssnprintf(dev_name, sizeof(dev_name), "port.%d", i);
+           snprintf(dev_name, sizeof(dev_name), "port.%d", i);
          }
  
          if (ec->config.link_status.notify) {
            int sev = ec->link_info[i].link_status ? NOTIF_OKAY : NOTIF_WARNING;
            char msg[DATA_MAX_NAME_LEN];
-           ssnprintf(msg, sizeof(msg), "Link Status: %s",
-                     ec->link_info[i].link_status ? "UP" : "DOWN");
+           snprintf(msg, sizeof(msg), "Link Status: %s",
+                    ec->link_info[i].link_status ? "UP" : "DOWN");
            dpdk_events_notification_dispatch(sev, dev_name,
                                              ec->link_info[i].read_time, msg);
          } else {
@@@ -556,7 -451,7 +556,7 @@@ static void dpdk_events_keep_alive_disp
      }
  
      char core_name[DATA_MAX_NAME_LEN];
-     ssnprintf(core_name, sizeof(core_name), "lcore%u", i);
+     snprintf(core_name, sizeof(core_name), "lcore%u", i);
  
      if (!ec->config.keep_alive.send_updated ||
          (ec->core_info[i].lcore_state !=
          switch (ec->config.keep_alive.shm->core_state[i]) {
          case RTE_KA_STATE_ALIVE:
            sev = NOTIF_OKAY;
-           ssnprintf(msg, sizeof(msg), "lcore %u Keep Alive Status: ALIVE", i);
+           snprintf(msg, sizeof(msg), "lcore %u Keep Alive Status: ALIVE", i);
            break;
          case RTE_KA_STATE_MISSING:
-           ssnprintf(msg, sizeof(msg), "lcore %u Keep Alive Status: MISSING", i);
+           snprintf(msg, sizeof(msg), "lcore %u Keep Alive Status: MISSING", i);
            sev = NOTIF_WARNING;
            break;
          case RTE_KA_STATE_DEAD:
-           ssnprintf(msg, sizeof(msg), "lcore %u Keep Alive Status: DEAD", i);
+           snprintf(msg, sizeof(msg), "lcore %u Keep Alive Status: DEAD", i);
            sev = NOTIF_FAILURE;
            break;
          case RTE_KA_STATE_UNUSED:
-           ssnprintf(msg, sizeof(msg), "lcore %u Keep Alive Status: UNUSED", i);
+           snprintf(msg, sizeof(msg), "lcore %u Keep Alive Status: UNUSED", i);
            sev = NOTIF_OKAY;
            break;
          case RTE_KA_STATE_GONE:
-           ssnprintf(msg, sizeof(msg), "lcore %u Keep Alive Status: GONE", i);
+           snprintf(msg, sizeof(msg), "lcore %u Keep Alive Status: GONE", i);
            sev = NOTIF_FAILURE;
            break;
          case RTE_KA_STATE_DOZING:
-           ssnprintf(msg, sizeof(msg), "lcore %u Keep Alive Status: DOZING", i);
+           snprintf(msg, sizeof(msg), "lcore %u Keep Alive Status: DOZING", i);
            sev = NOTIF_OKAY;
            break;
          case RTE_KA_STATE_SLEEP:
-           ssnprintf(msg, sizeof(msg), "lcore %u Keep Alive Status: SLEEP", i);
+           snprintf(msg, sizeof(msg), "lcore %u Keep Alive Status: SLEEP", i);
            sev = NOTIF_OKAY;
            break;
          default:
-           ssnprintf(msg, sizeof(msg), "lcore %u Keep Alive Status: UNKNOWN", i);
+           snprintf(msg, sizeof(msg), "lcore %u Keep Alive Status: UNKNOWN", i);
            sev = NOTIF_FAILURE;
          }
  
@@@ -622,76 -517,62 +622,76 @@@ static int dpdk_events_read(user_data_
    }
  
    dpdk_events_ctx_t *ec = DPDK_EVENTS_CTX_GET(g_hc);
 +  int ls_ret = -1, ka_ret = -1;
  
 +  int cmd_res = 0;
    if (ec->config.link_status.enabled) {
 -    int cmd_res = 0;
 -    int ret = dpdk_helper_command(g_hc, DPDK_CMD_GET_EVENTS, &cmd_res,
 -                                  ec->config.interval);
 -    if (cmd_res == 0 && ret == 0) {
 +    ls_ret = dpdk_helper_command(g_hc, DPDK_CMD_GET_EVENTS, &cmd_res,
 +                                 ec->config.interval);
 +    if (cmd_res == 0 && ls_ret == 0) {
        dpdk_events_link_status_dispatch(g_hc);
      }
    }
  
    if (ec->config.keep_alive.enabled) {
 -    dpdk_events_keep_alive_dispatch(g_hc);
 +    ka_ret = dpdk_event_keep_alive_shm_open();
 +    if (ka_ret) {
 +      ERROR(DPDK_EVENTS_PLUGIN
 +            ": %s : error %d in dpdk_event_keep_alive_shm_open()",
 +            __FUNCTION__, ka_ret);
 +    } else
 +      dpdk_events_keep_alive_dispatch(g_hc);
 +  }
 +
 +  if (!((cmd_res || ls_ret) == 0 || ka_ret == 0)) {
 +    ERROR(DPDK_EVENTS_PLUGIN ": Read failure for all enabled event types");
 +    return -1;
    }
  
    return 0;
  }
  
 -static int dpdk_events_init(void) {
 +static int dpdk_events_shutdown(void) {
    DPDK_EVENTS_TRACE();
  
 -  int ret = dpdk_events_preinit();
 -  if (ret)
 -    return ret;
 +  if (g_hc == NULL)
 +    return 0;
  
    dpdk_events_ctx_t *ec = DPDK_EVENTS_CTX_GET(g_hc);
 -
    if (ec->config.keep_alive.enabled) {
 -    ret = dpdk_event_keep_alive_shm_create();
 -    if (ret) {
 -      ERROR(DPDK_EVENTS_PLUGIN ": %s : error %d in ka_shm_create()",
 -            __FUNCTION__, ret);
 -      return ret;
 +    if (ec->config.keep_alive.fd != -1) {
 +      close(ec->config.keep_alive.fd);
 +      ec->config.keep_alive.fd = -1;
 +    }
 +
 +    if (ec->config.keep_alive.shm != MAP_FAILED) {
 +      if (munmap(ec->config.keep_alive.shm, sizeof(dpdk_keepalive_shm_t))) {
 +        ERROR(DPDK_EVENTS_PLUGIN ": munmap KA monitor failed");
 +        return -1;
 +      }
 +      ec->config.keep_alive.shm = MAP_FAILED;
      }
    }
 +
 +  dpdk_helper_shutdown(g_hc);
 +  g_hc = NULL;
 +
    return 0;
  }
  
 -static int dpdk_events_shutdown(void) {
 +static int dpdk_events_init(void) {
    DPDK_EVENTS_TRACE();
 -  int ret;
  
 -  dpdk_events_ctx_t *ec = DPDK_EVENTS_CTX_GET(g_hc);
 -  if (ec->config.keep_alive.enabled) {
 -    ret = munmap(ec->config.keep_alive.shm, sizeof(dpdk_keepalive_shm_t));
 -    if (ret) {
 -      ERROR(DPDK_EVENTS_PLUGIN ": munmap KA monitor returned %d", ret);
 -      return ret;
 -    }
 +  if (g_state & DPDK_EVENTS_STATE_CFG_ERR) {
 +    dpdk_events_shutdown();
 +    return -1;
    }
  
 -  ret = dpdk_helper_shutdown(g_hc);
 -  g_hc = NULL;
 +  int ret = dpdk_events_preinit();
    if (ret)
 -    ERROR(DPDK_EVENTS_PLUGIN ": failed to cleanup %s helper", DPDK_EVENTS_NAME);
 +    return ret;
  
 -  return ret;
 +  return 0;
  }
  
  void module_register(void) {
diff --combined src/dpdkstat.c
@@@ -91,17 -91,10 +91,17 @@@ struct dpdk_stats_ctx_s 
  };
  typedef struct dpdk_stats_ctx_s dpdk_stats_ctx_t;
  
 +typedef enum {
 +  DPDK_STAT_STATE_OKAY = 0,
 +  DPDK_STAT_STATE_CFG_ERR,
 +} dpdk_stat_cfg_status;
 +
  #define DPDK_STATS_CTX_GET(a) ((dpdk_stats_ctx_t *)dpdk_helper_priv_get(a))
  
  dpdk_helper_ctx_t *g_hc = NULL;
  static char g_shm_name[DATA_MAX_NAME_LEN] = DPDK_STATS_NAME;
 +static dpdk_stat_cfg_status g_state = DPDK_STAT_STATE_OKAY;
 +
  static int dpdk_stats_reinit_helper();
  static void dpdk_stats_default_config(void) {
    dpdk_stats_ctx_t *ec = DPDK_STATS_CTX_GET(g_hc);
@@@ -139,40 -132,30 +139,40 @@@ static int dpdk_stats_config(oconfig_it
    DPDK_STATS_TRACE();
  
    int ret = dpdk_stats_preinit();
 -  if (ret)
 -    return ret;
 +  if (ret) {
 +    g_state = DPDK_STAT_STATE_CFG_ERR;
 +    return 0;
 +  }
  
    dpdk_stats_ctx_t *ctx = DPDK_STATS_CTX_GET(g_hc);
  
    for (int i = 0; i < ci->children_num; i++) {
      oconfig_item_t *child = ci->children + i;
  
 -    if ((strcasecmp("EnabledPortMask", child->key) == 0) &&
 -        (child->values[0].type == OCONFIG_TYPE_NUMBER)) {
 -      ctx->config.enabled_port_mask = child->values[0].value.number;
 -      DEBUG("%s: Enabled Port Mask 0x%X", DPDK_STATS_PLUGIN,
 -            ctx->config.enabled_port_mask);
 -    } else if (strcasecmp("SharedMemObj", child->key) == 0) {
 -      cf_util_get_string_buffer(child, g_shm_name, sizeof(g_shm_name));
 -      DEBUG("%s: Shared memory object %s", DPDK_STATS_PLUGIN, g_shm_name);
 -      dpdk_stats_reinit_helper();
 -    } else if (strcasecmp("EAL", child->key) == 0) {
 +    if (strcasecmp("EnabledPortMask", child->key) == 0)
 +      ret = cf_util_get_int(child, (int *)&ctx->config.enabled_port_mask);
 +    else if (strcasecmp("SharedMemObj", child->key) == 0) {
 +      ret = cf_util_get_string_buffer(child, g_shm_name, sizeof(g_shm_name));
 +      if (ret == 0)
 +        ret = dpdk_stats_reinit_helper();
 +    } else if (strcasecmp("EAL", child->key) == 0)
        ret = dpdk_helper_eal_config_parse(g_hc, child);
 -      if (ret)
 -        return ret;
 +    else if (strcasecmp("PortName", child->key) != 0) {
 +      ERROR(DPDK_STATS_PLUGIN ": unrecognized configuration option %s",
 +            child->key);
 +      ret = -1;
 +    }
 +
 +    if (ret != 0) {
 +      g_state = DPDK_STAT_STATE_CFG_ERR;
 +      return 0;
      }
    }
  
 +  DEBUG(DPDK_STATS_PLUGIN ": Enabled Port Mask 0x%X",
 +        ctx->config.enabled_port_mask);
 +  DEBUG(DPDK_STATS_PLUGIN ": Shared memory object %s", g_shm_name);
 +
    int port_num = 0;
  
    /* parse port names after EnabledPortMask was parsed */
        while (!(ctx->config.enabled_port_mask & (1 << port_num)))
          port_num++;
  
 -      cf_util_get_string_buffer(child, ctx->config.port_name[port_num],
 -                                sizeof(ctx->config.port_name[port_num]));
 -      DEBUG("%s: Port %d Name: %s", DPDK_STATS_PLUGIN, port_num,
 +      if (cf_util_get_string_buffer(child, ctx->config.port_name[port_num],
 +                                    sizeof(ctx->config.port_name[port_num]))) {
 +        g_state = DPDK_STAT_STATE_CFG_ERR;
 +        return 0;
 +      }
 +
 +      DEBUG(DPDK_STATS_PLUGIN ": Port %d Name: %s", port_num,
              ctx->config.port_name[port_num]);
  
        port_num++;
      }
    }
  
 -  return ret;
 +  return 0;
  }
  
  static int dpdk_helper_stats_get(dpdk_helper_ctx_t *phc) {
@@@ -397,9 -376,9 +397,9 @@@ static int dpdk_stats_counters_dispatch
  
      char dev_name[64];
      if (ctx->config.port_name[i][0] != 0) {
-       ssnprintf(dev_name, sizeof(dev_name), "%s", ctx->config.port_name[i]);
+       snprintf(dev_name, sizeof(dev_name), "%s", ctx->config.port_name[i]);
      } else {
-       ssnprintf(dev_name, sizeof(dev_name), "port.%d", i);
+       snprintf(dev_name, sizeof(dev_name), "port.%d", i);
      }
  
      DEBUG(" === Dispatch stats for port %d (name=%s; stats_count=%d)", i,
@@@ -491,30 -470,31 +491,30 @@@ static int dpdk_stats_read(user_data_t 
    return 0;
  }
  
 -static int dpdk_stats_init(void) {
 +static int dpdk_stats_shutdown(void) {
    DPDK_STATS_TRACE();
 -  int ret = 0;
  
 -  ret = dpdk_stats_preinit();
 -  if (ret != 0) {
 -    return ret;
 -  }
 +  dpdk_helper_shutdown(g_hc);
 +  g_hc = NULL;
  
    return 0;
  }
  
 -static int dpdk_stats_shutdown(void) {
 +static int dpdk_stats_init(void) {
    DPDK_STATS_TRACE();
 -
    int ret = 0;
  
 -  ret = dpdk_helper_shutdown(g_hc);
 -  g_hc = NULL;
 +  if (g_state != DPDK_STAT_STATE_OKAY) {
 +    dpdk_stats_shutdown();
 +    return -1;
 +  }
 +
 +  ret = dpdk_stats_preinit();
    if (ret != 0) {
 -    ERROR("%s: failed to cleanup %s helper", DPDK_STATS_PLUGIN, g_shm_name);
      return ret;
    }
  
 -  return ret;
 +  return 0;
  }
  
  void module_register(void) {
diff --combined src/nginx.c
@@@ -122,8 -122,8 +122,8 @@@ static int init(void) 
      curl_easy_setopt(curl, CURLOPT_PASSWORD, (pass == NULL) ? "" : pass);
  #else
      static char credentials[1024];
-     int status = ssnprintf(credentials, sizeof(credentials), "%s:%s", user,
-                            pass == NULL ? "" : pass);
+     int status = snprintf(credentials, sizeof(credentials), "%s:%s", user,
+                           pass == NULL ? "" : pass);
      if ((status < 0) || ((size_t)status >= sizeof(credentials))) {
        ERROR("nginx plugin: Credentials would have been truncated.");
        return -1;
  #endif
    }
  
 -  if (url != NULL) {
 -    curl_easy_setopt(curl, CURLOPT_URL, url);
 -  }
 -
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
    curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 50L);
  
@@@ -203,9 -207,6 +203,9 @@@ static int nginx_read(void) 
      return -1;
  
    nginx_buffer_len = 0;
 +
 +  curl_easy_setopt(curl, CURLOPT_URL, url);
 +
    if (curl_easy_perform(curl) != CURLE_OK) {
      WARNING("nginx plugin: curl_easy_perform failed: %s", nginx_curl_error);
      return -1;
diff --combined src/snmp_agent.c
@@@ -98,7 -98,6 +98,7 @@@ static snmp_agent_ctx_t *g_agent = NULL
        (_dd->type ? !strcmp(_dd->type, _t) : 0) &&                              \
        (_dd->type_instance ? !strcmp(_dd->type_instance, _ti) : 1)
  
 +static int snmp_agent_shutdown(void);
  static void *snmp_agent_thread_run(void *arg);
  static int snmp_agent_register_oid(oid_t *oid, Netsnmp_Node_Handler *handler);
  static int snmp_agent_set_vardata(void *dst_buf, size_t *dst_buf_len,
@@@ -124,7 -123,7 +124,7 @@@ static int snmp_agent_oid_to_string(cha
    char *oid_str_ptr[MAX_OID_LEN];
  
    for (size_t i = 0; i < o->oid_len; i++) {
-     ssnprintf(oid_str[i], sizeof(oid_str[i]), "%lu", (unsigned long)o->oid[i]);
+     snprintf(oid_str[i], sizeof(oid_str[i]), "%lu", (unsigned long)o->oid[i]);
      oid_str_ptr[i] = oid_str[i];
    }
  
@@@ -166,7 -165,7 +166,7 @@@ static void snmp_agent_dump_data(void) 
          DEBUG(PLUGIN_NAME ":     TypeInstance: %s", dd->type_instance);
        for (size_t i = 0; i < dd->oids_len; i++) {
          snmp_agent_oid_to_string(oid_str, sizeof(oid_str), &dd->oids[i]);
 -        DEBUG(PLUGIN_NAME ":     OID[%d]: %s", i, oid_str);
 +        DEBUG(PLUGIN_NAME ":     OID[%zu]: %s", i, oid_str);
        }
        DEBUG(PLUGIN_NAME ":   Scale: %g", dd->scale);
        DEBUG(PLUGIN_NAME ":   Shift: %g", dd->shift);
        DEBUG(PLUGIN_NAME ":   TypeInstance: %s", dd->type_instance);
      for (size_t i = 0; i < dd->oids_len; i++) {
        snmp_agent_oid_to_string(oid_str, sizeof(oid_str), &dd->oids[i]);
 -      DEBUG(PLUGIN_NAME ":   OID[%d]: %s", i, oid_str);
 +      DEBUG(PLUGIN_NAME ":   OID[%zu]: %s", i, oid_str);
      }
      DEBUG(PLUGIN_NAME ":   Scale: %g", dd->scale);
      DEBUG(PLUGIN_NAME ":   Shift: %g", dd->shift);
@@@ -283,7 -282,8 +283,8 @@@ static int snmp_agent_validate_data(voi
    return 0;
  }
  
- static void snmp_agent_generate_oid2string(oid_t *oid, size_t offset, char *key) {
+ static void snmp_agent_generate_oid2string(oid_t *oid, size_t offset,
+                                            char *key) {
    int key_len = oid->oid[offset];
    int i;
  
@@@ -369,9 -369,9 +370,9 @@@ static int snmp_agent_table_row_remove(
        .severity = NOTIF_WARNING, .time = cdtime(), .plugin = PLUGIN_NAME};
    sstrncpy(n.host, hostname_g, sizeof(n.host));
    sstrncpy(n.plugin_instance, ins, sizeof(n.plugin_instance));
-   ssnprintf(n.message, sizeof(n.message),
-             "Removed data row from table %s instance %s index %d", td->name,
-             ins, (index != NULL) ? *index : -1);
+   snprintf(n.message, sizeof(n.message),
+            "Removed data row from table %s instance %s index %d", td->name, ins,
+            (index != NULL) ? *index : -1);
    plugin_dispatch_notification(&n);
  
    if (td->index_oid.oid_len) {
@@@ -421,6 -421,28 +422,6 @@@ static void snmp_agent_free_data(data_d
      for (size_t i = 0; i < (*dd)->oids_len; i++)
        unregister_mib((*dd)->oids[i].oid, (*dd)->oids[i].oid_len);
    }
 -  if (!(*dd)->table->index_oid.oid_len) {
 -    char *instance;
 -
 -    c_avl_iterator_t *iter = c_avl_get_iterator((*dd)->table->instance_index);
 -    while (c_avl_iterator_next(iter, (void *)&instance, (void *)&instance) ==
 -           0) {
 -      for (size_t i = 0; i < (*dd)->oids_len; i++)
 -        snmp_agent_unregister_oid_string(&(*dd)->oids[i], instance);
 -    }
 -    c_avl_iterator_destroy(iter);
 -  } else {
 -    /* unregister all table OIDs */
 -    int *index;
 -    char *value;
 -
 -    c_avl_iterator_t *iter = c_avl_get_iterator((*dd)->table->index_instance);
 -    while (c_avl_iterator_next(iter, (void *)&index, (void *)&value) == 0) {
 -      for (size_t i = 0; i < (*dd)->oids_len; i++)
 -        snmp_agent_unregister_oid_index(&(*dd)->oids[i], *index);
 -    }
 -    c_avl_iterator_destroy(iter);
 -  }
  
    sfree((*dd)->name);
    sfree((*dd)->plugin);
    return;
  }
  
 +static void snmp_agent_free_table_columns(table_definition_t *td) {
 +  if (td->columns == NULL)
 +    return;
 +
 +  for (llentry_t *de = llist_head(td->columns); de != NULL; de = de->next) {
 +    data_definition_t *dd = de->value;
 +
 +    if (td->index_oid.oid_len) {
 +      int *index;
 +      char *instance;
 +
 +      c_avl_iterator_t *iter = c_avl_get_iterator(td->index_instance);
 +      while (c_avl_iterator_next(iter, (void *)&index, (void *)&instance) ==
 +             0) {
 +        for (size_t i = 0; i < dd->oids_len; i++)
 +          snmp_agent_unregister_oid_index(&dd->oids[i], *index);
 +      }
 +      c_avl_iterator_destroy(iter);
 +    } else {
 +      char *instance;
 +
 +      c_avl_iterator_t *iter = c_avl_get_iterator(dd->table->instance_index);
 +      while (c_avl_iterator_next(iter, (void *)&instance, (void *)&instance) ==
 +             0) {
 +        for (size_t i = 0; i < dd->oids_len; i++)
 +          snmp_agent_unregister_oid_string(&dd->oids[i], instance);
 +      }
 +      c_avl_iterator_destroy(iter);
 +    }
 +
 +    snmp_agent_free_data(&dd);
 +  }
 +
 +  llist_destroy(td->columns);
 +  td->columns = NULL;
 +} /* void snmp_agent_free_table_columns */
 +
  static void snmp_agent_free_table(table_definition_t **td) {
  
    if (td == NULL || *td == NULL)
    if ((*td)->size_oid.oid_len)
      unregister_mib((*td)->size_oid.oid, (*td)->size_oid.oid_len);
  
 +  /* Unregister Index OIDs */
    if ((*td)->index_oid.oid_len) {
      int *index;
 -    char *value;
 +    char *instance;
  
      c_avl_iterator_t *iter = c_avl_get_iterator((*td)->index_instance);
 -    while (c_avl_iterator_next(iter, (void *)&index, (void *)&value) == 0)
 +    while (c_avl_iterator_next(iter, (void *)&index, (void *)&instance) == 0)
        snmp_agent_unregister_oid_index(&(*td)->index_oid, *index);
  
      c_avl_iterator_destroy(iter);
    }
  
 -  for (llentry_t *de = llist_head((*td)->columns); de != NULL; de = de->next) {
 -    data_definition_t *dd = de->value;
 -    snmp_agent_free_data(&dd);
 -  }
 -
 -  llist_destroy((*td)->columns);
 +  /* Unregister all table columns and their registered OIDs */
 +  snmp_agent_free_table_columns(*td);
  
    void *key = NULL;
    void *value = NULL;
@@@ -629,9 -617,9 +630,9 @@@ snmp_agent_table_oid_handler(struct net
  
          if (dd->is_instance) {
            requests->requestvb->type = ASN_OCTET_STR;
-           snmp_set_var_typed_value(requests->requestvb,
-                                    requests->requestvb->type, (const u_char *)instance,
-                                    strlen((instance)));
+           snmp_set_var_typed_value(
+               requests->requestvb, requests->requestvb->type,
+               (const u_char *)instance, strlen((instance)));
  
            pthread_mutex_unlock(&g_agent->lock);
  
@@@ -1318,9 -1306,9 +1319,9 @@@ static int snmp_agent_update_index(tabl
        .severity = NOTIF_OKAY, .time = cdtime(), .plugin = PLUGIN_NAME};
    sstrncpy(n.host, hostname_g, sizeof(n.host));
    sstrncpy(n.plugin_instance, ins, sizeof(n.plugin_instance));
-   ssnprintf(n.message, sizeof(n.message),
-             "Data row added to table %s instance %s index %d", td->name, ins,
-             (index != NULL) ? *index : -1);
+   snprintf(n.message, sizeof(n.message),
+            "Data row added to table %s instance %s index %d", td->name, ins,
+            (index != NULL) ? *index : -1);
    plugin_dispatch_notification(&n);
  
    return 0;
@@@ -1377,21 -1365,12 +1378,21 @@@ static int snmp_agent_preinit(void) 
    g_agent->tables = llist_create();
    g_agent->scalars = llist_create();
  
 +  if (g_agent->tables == NULL || g_agent->scalars == NULL) {
 +    ERROR(PLUGIN_NAME ": llist_create() failed");
 +    llist_destroy(g_agent->scalars);
 +    llist_destroy(g_agent->tables);
 +    return -ENOMEM;
 +  }
 +
    int err;
    /* make us a agentx client. */
    err = netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_ROLE,
                                 1);
    if (err != 0) {
      ERROR(PLUGIN_NAME ": Failed to set agent role (%d)", err);
 +    llist_destroy(g_agent->scalars);
 +    llist_destroy(g_agent->tables);
      return -1;
    }
  
    err = init_agent(PLUGIN_NAME);
    if (err != 0) {
      ERROR(PLUGIN_NAME ": Failed to initialize the agent library (%d)", err);
 +    llist_destroy(g_agent->scalars);
 +    llist_destroy(g_agent->tables);
      return -1;
    }
  
  static int snmp_agent_init(void) {
    int ret;
  
 -  ret = snmp_agent_preinit();
 -  if (ret != 0)
 -    return ret;
 +  if (g_agent == NULL || ((llist_head(g_agent->scalars) == NULL) &&
 +                          (llist_head(g_agent->tables) == NULL))) {
 +    ERROR(PLUGIN_NAME ": snmp_agent_init: plugin not configured");
 +    return -EINVAL;
 +  }
 +
 +  plugin_register_shutdown(PLUGIN_NAME, snmp_agent_shutdown);
  
    ret = snmp_agent_register_scalar_oids();
    if (ret != 0)
    if (ret != 0)
      return ret;
  
 -  /* create a second thread to listen for requests from AgentX*/
 -  ret = pthread_create(&g_agent->thread, NULL, &snmp_agent_thread_run, NULL);
 -  if (ret != 0) {
 -    ERROR(PLUGIN_NAME ": Failed to create a separate thread, err %u", ret);
 -    return ret;
 -  }
 -
    ret = pthread_mutex_init(&g_agent->lock, NULL);
    if (ret != 0) {
      ERROR(PLUGIN_NAME ": Failed to initialize mutex, err %u", ret);
      return ret;
    }
  
 +  /* create a second thread to listen for requests from AgentX*/
 +  ret = pthread_create(&g_agent->thread, NULL, &snmp_agent_thread_run, NULL);
 +  if (ret != 0) {
 +    ERROR(PLUGIN_NAME ": Failed to create a separate thread, err %u", ret);
 +    return ret;
 +  }
 +
 +  if (llist_head(g_agent->tables) != NULL) {
 +    plugin_register_write(PLUGIN_NAME, snmp_agent_collect, NULL);
 +    plugin_register_missing(PLUGIN_NAME, snmp_agent_clear_missing, NULL);
 +  }
 +
    return 0;
  }
  
@@@ -1603,4 -1571,7 +1604,4 @@@ static int snmp_agent_config(oconfig_it
  void module_register(void) {
    plugin_register_init(PLUGIN_NAME, snmp_agent_init);
    plugin_register_complex_config(PLUGIN_NAME, snmp_agent_config);
 -  plugin_register_write(PLUGIN_NAME, snmp_agent_collect, NULL);
 -  plugin_register_missing(PLUGIN_NAME, snmp_agent_clear_missing, NULL);
 -  plugin_register_shutdown(PLUGIN_NAME, snmp_agent_shutdown);
  }
diff --combined src/utils_dpdk.c
@@@ -66,7 -66,7 +66,7 @@@ struct dpdk_helper_ctx_s 
    int eal_initialized;
  
    size_t shm_size;
 -  const char *shm_name;
 +  char shm_name[DATA_MAX_NAME_LEN];
  
    sem_t sema_cmd_start;
    sem_t sema_cmd_complete;
@@@ -103,10 -103,11 +103,10 @@@ static void dpdk_helper_config_default(
  
    DPDK_HELPER_TRACE(phc->shm_name);
  
-   ssnprintf(phc->eal_config.coremask, DATA_MAX_NAME_LEN, "%s", "0xf");
-   ssnprintf(phc->eal_config.memory_channels, DATA_MAX_NAME_LEN, "%s", "1");
-   ssnprintf(phc->eal_config.file_prefix, DATA_MAX_NAME_LEN, "%s",
-             DPDK_DEFAULT_RTE_CONFIG);
+   snprintf(phc->eal_config.coremask, DATA_MAX_NAME_LEN, "%s", "0xf");
+   snprintf(phc->eal_config.memory_channels, DATA_MAX_NAME_LEN, "%s", "1");
 -  snprintf(phc->eal_config.process_type, DATA_MAX_NAME_LEN, "%s", "secondary");
+   snprintf(phc->eal_config.file_prefix, DATA_MAX_NAME_LEN, "%s",
+            DPDK_DEFAULT_RTE_CONFIG);
  }
  
  int dpdk_helper_eal_config_set(dpdk_helper_ctx_t *phc, dpdk_eal_config_t *ec) {
@@@ -161,7 -162,6 +161,7 @@@ int dpdk_helper_eal_config_parse(dpdk_h
    int status = 0;
    for (int i = 0; i < ci->children_num; i++) {
      oconfig_item_t *child = ci->children + i;
 +
      if (strcasecmp("Coremask", child->key) == 0) {
        status = cf_util_get_string_buffer(child, phc->eal_config.coremask,
                                           sizeof(phc->eal_config.coremask));
        status = cf_util_get_string_buffer(child, phc->eal_config.socket_memory,
                                           sizeof(phc->eal_config.socket_memory));
        DEBUG("dpdk_common: EAL:Socket memory %s", phc->eal_config.socket_memory);
 -    } else if (strcasecmp("ProcessType", child->key) == 0) {
 -      status = cf_util_get_string_buffer(child, phc->eal_config.process_type,
 -                                         sizeof(phc->eal_config.process_type));
 -      DEBUG("dpdk_common: EAL:Process type %s", phc->eal_config.process_type);
 -    } else if ((strcasecmp("FilePrefix", child->key) == 0) &&
 -               (child->values[0].type == OCONFIG_TYPE_STRING)) {
 -      snprintf(phc->eal_config.file_prefix, DATA_MAX_NAME_LEN,
 -               "/var/run/.%s_config", child->values[0].value.string);
 -      DEBUG("dpdk_common: EAL:File prefix %s", phc->eal_config.file_prefix);
 +    } else if (strcasecmp("FilePrefix", child->key) == 0) {
 +      char prefix[DATA_MAX_NAME_LEN];
 +
 +      status = cf_util_get_string_buffer(child, prefix, sizeof(prefix));
 +      if (status == 0) {
-         ssnprintf(phc->eal_config.file_prefix, DATA_MAX_NAME_LEN,
++        snprintf(phc->eal_config.file_prefix, DATA_MAX_NAME_LEN,
 +                  "/var/run/.%s_config", prefix);
 +        DEBUG("dpdk_common: EAL:File prefix %s", phc->eal_config.file_prefix);
 +      }
      } else {
        ERROR("dpdk_common: Invalid '%s' configuration option", child->key);
        status = -EINVAL;
@@@ -242,16 -242,13 +242,16 @@@ static void dpdk_shm_cleanup(const cha
    DPDK_HELPER_TRACE(name);
    char errbuf[ERR_BUF_SIZE];
  
 +  /*
 +   * Call shm_unlink first, as 'name' might be no longer accessible after munmap
 +   */
 +  if (shm_unlink(name))
 +    ERROR("shm_unlink failure %s", sstrerror(errno, errbuf, sizeof(errbuf)));
 +
    if (map != NULL) {
      if (munmap(map, size))
        ERROR("munmap failure %s", sstrerror(errno, errbuf, sizeof(errbuf)));
    }
 -
 -  if (shm_unlink(name))
 -    ERROR("shm_unlink failure %s", sstrerror(errno, errbuf, sizeof(errbuf)));
  }
  
  void *dpdk_helper_priv_get(dpdk_helper_ctx_t *phc) {
@@@ -316,7 -313,7 +316,7 @@@ int dpdk_helper_init(const char *name, 
    }
  
    phc->shm_size = shm_size;
 -  phc->shm_name = name;
 +  sstrncpy(phc->shm_name, name, sizeof(phc->shm_name));
  
    dpdk_helper_config_default(phc);
  
    return 0;
  }
  
 -int dpdk_helper_shutdown(dpdk_helper_ctx_t *phc) {
 -  if (phc == NULL) {
 -    ERROR("%s:Invalid argument(phc)", __FUNCTION__);
 -    return -EINVAL;
 -  }
 +void dpdk_helper_shutdown(dpdk_helper_ctx_t *phc) {
 +  if (phc == NULL)
 +    return;
  
    DPDK_HELPER_TRACE(phc->shm_name);
  
    sem_destroy(&phc->sema_cmd_start);
    sem_destroy(&phc->sema_cmd_complete);
    dpdk_shm_cleanup(phc->shm_name, phc->shm_size, (void *)phc);
 -
 -  return 0;
  }
  
  static int dpdk_helper_spawn(dpdk_helper_ctx_t *phc) {
@@@ -470,6 -471,7 +470,6 @@@ static int dpdk_helper_eal_init(dpdk_he
    /* EAL config must be initialized */
    assert(phc->eal_config.coremask[0] != 0);
    assert(phc->eal_config.memory_channels[0] != 0);
 -  assert(phc->eal_config.process_type[0] != 0);
    assert(phc->eal_config.file_prefix[0] != 0);
  
    argp[argc++] = "collectd-dpdk";
    }
  
    argp[argc++] = "--proc-type";
 -  argp[argc++] = phc->eal_config.process_type;
 +  argp[argc++] = "secondary";
  
    assert(argc <= (DPDK_EAL_ARGC * 2 + 1));
  
diff --combined src/write_http.c
@@@ -119,7 -119,6 +119,7 @@@ static int wh_post_nolock(wh_callback_
  {
    int status = 0;
  
 +  curl_easy_setopt(cb->curl, CURLOPT_URL, cb->location);
    curl_easy_setopt(cb->curl, CURLOPT_POSTFIELDS, data);
    status = curl_easy_perform(cb->curl);
  
@@@ -169,6 -168,7 +169,6 @@@ static int wh_callback_init(wh_callback
    curl_easy_setopt(cb->curl, CURLOPT_HTTPHEADER, cb->headers);
  
    curl_easy_setopt(cb->curl, CURLOPT_ERRORBUFFER, cb->curl_errbuf);
 -  curl_easy_setopt(cb->curl, CURLOPT_URL, cb->location);
    curl_easy_setopt(cb->curl, CURLOPT_FOLLOWLOCATION, 1L);
    curl_easy_setopt(cb->curl, CURLOPT_MAXREDIRS, 50L);
  
        return -1;
      }
  
-     ssnprintf(cb->credentials, credentials_size, "%s:%s", cb->user,
-               (cb->pass == NULL) ? "" : cb->pass);
+     snprintf(cb->credentials, credentials_size, "%s:%s", cb->user,
+              (cb->pass == NULL) ? "" : cb->pass);
      curl_easy_setopt(cb->curl, CURLOPT_USERPWD, cb->credentials);
  #endif
      curl_easy_setopt(cb->curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
@@@ -369,9 -369,9 +369,9 @@@ static int wh_write_command(const data_
      return status;
    }
  
-   command_len = (size_t)ssnprintf(command, sizeof(command),
-                                   "PUTVAL %s interval=%.3f %s\r\n", key,
-                                   CDTIME_T_TO_DOUBLE(vl->interval), values);
+   command_len = (size_t)snprintf(command, sizeof(command),
+                                  "PUTVAL %s interval=%.3f %s\r\n", key,
+                                  CDTIME_T_TO_DOUBLE(vl->interval), values);
    if (command_len >= sizeof(command)) {
      ERROR("write_http plugin: Command buffer too small: "
            "Need %zu bytes.",
@@@ -791,7 -791,7 +791,7 @@@ static int wh_config_node(oconfig_item_
    /* Nulls the buffer and sets ..._free and ..._fill. */
    wh_reset_buffer(cb);
  
-   ssnprintf(callback_name, sizeof(callback_name), "write_http/%s", cb->name);
+   snprintf(callback_name, sizeof(callback_name), "write_http/%s", cb->name);
    DEBUG("write_http: Registering write callback '%s' with URL '%s'",
          callback_name, cb->location);
  
diff --combined src/write_mongodb.c
@@@ -93,10 -93,10 +93,10 @@@ static bson_t *wm_create_bson(const dat
    BSON_APPEND_UTF8(ret, "type_instance", vl->type_instance);
  
    BSON_APPEND_ARRAY_BEGIN(ret, "values", &subarray); /* {{{ */
 -  for (int i = 0; i < ds->ds_num; i++) {
 +  for (size_t i = 0; i < ds->ds_num; i++) {
      char key[16];
  
-     ssnprintf(key, sizeof(key), "%zu", i);
 -    snprintf(key, sizeof(key), "%i", i);
++    snprintf(key, sizeof(key), "%zu", i);
  
      if (ds->ds[i].type == DS_TYPE_GAUGE)
        BSON_APPEND_DOUBLE(&subarray, key, vl->values[i].gauge);
      else if (ds->ds[i].type == DS_TYPE_ABSOLUTE)
        BSON_APPEND_INT64(&subarray, key, vl->values[i].absolute);
      else {
 -      ERROR("write_mongodb plugin: Unknown ds_type %d for index %d",
 +      ERROR("write_mongodb plugin: Unknown ds_type %d for index %zu",
              ds->ds[i].type, i);
        bson_destroy(ret);
        return NULL;
    bson_append_array_end(ret, &subarray); /* }}} values */
  
    BSON_APPEND_ARRAY_BEGIN(ret, "dstypes", &subarray); /* {{{ */
 -  for (int i = 0; i < ds->ds_num; i++) {
 +  for (size_t i = 0; i < ds->ds_num; i++) {
      char key[16];
  
-     ssnprintf(key, sizeof(key), "%zu", i);
 -    snprintf(key, sizeof(key), "%i", i);
++    snprintf(key, sizeof(key), "%zu", i);
  
      if (store_rates)
        BSON_APPEND_UTF8(&subarray, key, "gauge");
    bson_append_array_end(ret, &subarray); /* }}} dstypes */
  
    BSON_APPEND_ARRAY_BEGIN(ret, "dsnames", &subarray); /* {{{ */
 -  for (int i = 0; i < ds->ds_num; i++) {
 +  for (size_t i = 0; i < ds->ds_num; i++) {
      char key[16];
  
-     ssnprintf(key, sizeof(key), "%zu", i);
 -    snprintf(key, sizeof(key), "%i", i);
++    snprintf(key, sizeof(key), "%zu", i);
      BSON_APPEND_UTF8(&subarray, key, ds->ds[i].name);
    }
    bson_append_array_end(ret, &subarray); /* }}} dsnames */
@@@ -366,9 -366,9 +366,9 @@@ static int wm_config_node(oconfig_item_
    }
  
    if (status == 0) {
-     char cb_name[DATA_MAX_NAME_LEN];
+     char cb_name[sizeof("write_mongodb/") + DATA_MAX_NAME_LEN];
  
-     ssnprintf(cb_name, sizeof(cb_name), "write_mongodb/%s", node->name);
+     snprintf(cb_name, sizeof(cb_name), "write_mongodb/%s", node->name);
  
      status =
          plugin_register_write(cb_name, wm_write,