Don't initialize static numeric variables to 0
[collectd.git] / src / ping.c
index 6d9545f..ffb1691 100644 (file)
@@ -69,25 +69,26 @@ typedef struct hostlist_s hostlist_t;
 /*
  * Private variables
  */
-static hostlist_t *hostlist_head = NULL;
+static hostlist_t *hostlist_head;
 
-static char *ping_source = NULL;
+static int ping_af = PING_DEF_AF;
+static char *ping_source;
 #ifdef HAVE_OPING_1_3
-static char *ping_device = NULL;
+static char *ping_device;
 #endif
-static char *ping_data = NULL;
+static char *ping_data;
 static int ping_ttl = PING_DEF_TTL;
 static double ping_interval = 1.0;
 static double ping_timeout = 0.9;
 static int ping_max_missed = -1;
 
-static int ping_thread_loop = 0;
-static int ping_thread_error = 0;
-static pthread_t ping_thread_id;
 static pthread_mutex_t ping_lock = PTHREAD_MUTEX_INITIALIZER;
 static pthread_cond_t ping_cond = PTHREAD_COND_INITIALIZER;
+static int ping_thread_loop;
+static int ping_thread_error;
+static pthread_t ping_thread_id;
 
-static const char *config_keys[] = {"Host",    "SourceAddress",
+static const char *config_keys[] = {"Host",    "SourceAddress", "AddressFamily",
 #ifdef HAVE_OPING_1_3
                                     "Device",
 #endif
@@ -219,13 +220,11 @@ static int ping_dispatch_all(pingobj_t *pingobj) /* {{{ */
     } /* }}} ping_max_missed */
   }   /* }}} for (iter) */
 
-  return (0);
+  return 0;
 } /* }}} int ping_dispatch_all */
 
 static void *ping_thread(void *arg) /* {{{ */
 {
-  pingobj_t *pingobj = NULL;
-
   struct timeval tv_begin;
   struct timeval tv_end;
   struct timespec ts_wait;
@@ -235,14 +234,19 @@ static void *ping_thread(void *arg) /* {{{ */
 
   c_complain_t complaint = C_COMPLAIN_INIT_STATIC;
 
-  pthread_mutex_lock(&ping_lock);
-
-  pingobj = ping_construct();
+  pingobj_t *pingobj = ping_construct();
   if (pingobj == NULL) {
     ERROR("ping plugin: ping_construct failed.");
+    pthread_mutex_lock(&ping_lock);
     ping_thread_error = 1;
     pthread_mutex_unlock(&ping_lock);
-    return ((void *)-1);
+    return (void *)-1;
+  }
+
+  if (ping_af != PING_DEF_AF) {
+    if (ping_setopt(pingobj, PING_OPT_AF, &ping_af) != 0)
+      ERROR("ping plugin: Failed to set address family: %s",
+            ping_get_error(pingobj));
   }
 
   if (ping_source != NULL)
@@ -276,9 +280,10 @@ static void *ping_thread(void *arg) /* {{{ */
 
   if (count == 0) {
     ERROR("ping plugin: No host could be added to ping object. Giving up.");
+    pthread_mutex_lock(&ping_lock);
     ping_thread_error = 1;
     pthread_mutex_unlock(&ping_lock);
-    return ((void *)-1);
+    return (void *)-1;
   }
 
   /* Set up `ts_int' */
@@ -291,27 +296,25 @@ static void *ping_thread(void *arg) /* {{{ */
     ts_int.tv_nsec = (long)(temp_nsec * 1000000000L);
   }
 
+  pthread_mutex_lock(&ping_lock);
   while (ping_thread_loop > 0) {
-    int status;
-    _Bool send_successful = 0;
+    bool send_successful = false;
 
     if (gettimeofday(&tv_begin, NULL) < 0) {
-      char errbuf[1024];
-      ERROR("ping plugin: gettimeofday failed: %s",
-            sstrerror(errno, errbuf, sizeof(errbuf)));
+      ERROR("ping plugin: gettimeofday failed: %s", STRERRNO);
       ping_thread_error = 1;
       break;
     }
 
     pthread_mutex_unlock(&ping_lock);
 
-    status = ping_send(pingobj);
+    int status = ping_send(pingobj);
     if (status < 0) {
       c_complain(LOG_ERR, &complaint, "ping plugin: ping_send failed: %s",
                  ping_get_error(pingobj));
     } else {
       c_release(LOG_NOTICE, &complaint, "ping plugin: ping_send succeeded.");
-      send_successful = 1;
+      send_successful = true;
     }
 
     pthread_mutex_lock(&ping_lock);
@@ -323,9 +326,7 @@ static void *ping_thread(void *arg) /* {{{ */
       (void)ping_dispatch_all(pingobj);
 
     if (gettimeofday(&tv_end, NULL) < 0) {
-      char errbuf[1024];
-      ERROR("ping plugin: gettimeofday failed: %s",
-            sstrerror(errno, errbuf, sizeof(errbuf)));
+      ERROR("ping plugin: gettimeofday failed: %s", STRERRNO);
       ping_thread_error = 1;
       break;
     }
@@ -342,7 +343,7 @@ static void *ping_thread(void *arg) /* {{{ */
   pthread_mutex_unlock(&ping_lock);
   ping_destroy(pingobj);
 
-  return ((void *)0);
+  return (void *)0;
 } /* }}} void *ping_thread */
 
 static int start_thread(void) /* {{{ */
@@ -353,7 +354,7 @@ static int start_thread(void) /* {{{ */
 
   if (ping_thread_loop != 0) {
     pthread_mutex_unlock(&ping_lock);
-    return (0);
+    return 0;
   }
 
   ping_thread_loop = 1;
@@ -364,11 +365,11 @@ static int start_thread(void) /* {{{ */
     ping_thread_loop = 0;
     ERROR("ping plugin: Starting thread failed.");
     pthread_mutex_unlock(&ping_lock);
-    return (-1);
+    return -1;
   }
 
   pthread_mutex_unlock(&ping_lock);
-  return (0);
+  return 0;
 } /* }}} int start_thread */
 
 static int stop_thread(void) /* {{{ */
@@ -379,7 +380,7 @@ static int stop_thread(void) /* {{{ */
 
   if (ping_thread_loop == 0) {
     pthread_mutex_unlock(&ping_lock);
-    return (-1);
+    return -1;
   }
 
   ping_thread_loop = 0;
@@ -397,14 +398,14 @@ static int stop_thread(void) /* {{{ */
   ping_thread_error = 0;
   pthread_mutex_unlock(&ping_lock);
 
-  return (status);
+  return status;
 } /* }}} int stop_thread */
 
 static int ping_init(void) /* {{{ */
 {
   if (hostlist_head == NULL) {
     NOTICE("ping plugin: No hosts have been configured.");
-    return (-1);
+    return -1;
   }
 
   if (ping_timeout > ping_interval) {
@@ -427,7 +428,7 @@ static int ping_init(void) /* {{{ */
   }
 #endif
 
-  return (start_thread());
+  return start_thread();
 } /* }}} int ping_init */
 
 static int config_set_string(const char *name, /* {{{ */
@@ -436,16 +437,15 @@ static int config_set_string(const char *name, /* {{{ */
 
   tmp = strdup(value);
   if (tmp == NULL) {
-    char errbuf[1024];
     ERROR("ping plugin: Setting `%s' to `%s' failed: strdup failed: %s", name,
-          value, sstrerror(errno, errbuf, sizeof(errbuf)));
-    return (1);
+          value, STRERRNO);
+    return 1;
   }
 
   if (*var != NULL)
     free(*var);
   *var = tmp;
-  return (0);
+  return 0;
 } /* }}} int config_set_string */
 
 static int ping_config(const char *key, const char *value) /* {{{ */
@@ -456,19 +456,15 @@ static int ping_config(const char *key, const char *value) /* {{{ */
 
     hl = malloc(sizeof(*hl));
     if (hl == NULL) {
-      char errbuf[1024];
-      ERROR("ping plugin: malloc failed: %s",
-            sstrerror(errno, errbuf, sizeof(errbuf)));
-      return (1);
+      ERROR("ping plugin: malloc failed: %s", STRERRNO);
+      return 1;
     }
 
     host = strdup(value);
     if (host == NULL) {
-      char errbuf[1024];
       sfree(hl);
-      ERROR("ping plugin: strdup failed: %s",
-            sstrerror(errno, errbuf, sizeof(errbuf)));
-      return (1);
+      ERROR("ping plugin: strdup failed: %s", STRERRNO);
+      return 1;
     }
 
     hl->host = host;
@@ -479,16 +475,33 @@ static int ping_config(const char *key, const char *value) /* {{{ */
     hl->latency_squared = 0.0;
     hl->next = hostlist_head;
     hostlist_head = hl;
+  } else if (strcasecmp(key, "AddressFamily") == 0) {
+    char *af = NULL;
+    int status = config_set_string(key, &af, value);
+    if (status != 0)
+      return status;
+
+    if (strncmp(af, "any", 3) == 0) {
+      ping_af = AF_UNSPEC;
+    } else if (strncmp(af, "ipv4", 4) == 0) {
+      ping_af = AF_INET;
+    } else if (strncmp(af, "ipv6", 4) == 0) {
+      ping_af = AF_INET6;
+    } else {
+      WARNING("ping plugin: Ignoring invalid AddressFamily value %s", af);
+    }
+    free(af);
+
   } else if (strcasecmp(key, "SourceAddress") == 0) {
     int status = config_set_string(key, &ping_source, value);
     if (status != 0)
-      return (status);
+      return status;
   }
 #ifdef HAVE_OPING_1_3
   else if (strcasecmp(key, "Device") == 0) {
     int status = config_set_string(key, &ping_device, value);
     if (status != 0)
-      return (status);
+      return status;
   }
 #endif
   else if (strcasecmp(key, "TTL") == 0) {
@@ -514,7 +527,7 @@ static int ping_config(const char *key, const char *value) /* {{{ */
       ping_data = malloc(size + 1);
       if (ping_data == NULL) {
         ERROR("ping plugin: malloc failed.");
-        return (1);
+        return 1;
       }
 
       /* Note: By default oping is using constant string
@@ -532,7 +545,7 @@ static int ping_config(const char *key, const char *value) /* {{{ */
       } /* }}} for (i = 0; i < size; i++) */
       ping_data[size] = 0;
     } else
-      WARNING("ping plugin: Ignoring invalid Size %zu.", size);
+      WARNING("ping plugin: Ignoring invalid Size %" PRIsz ".", size);
   } else if (strcasecmp(key, "Timeout") == 0) {
     double tmp;
 
@@ -546,10 +559,10 @@ static int ping_config(const char *key, const char *value) /* {{{ */
     if (ping_max_missed < 0)
       INFO("ping plugin: MaxMissed < 0, disabled re-resolving of hosts");
   } else {
-    return (-1);
+    return -1;
   }
 
-  return (0);
+  return 0;
 } /* }}} int ping_config */
 
 static void submit(const char *host, const char *type, /* {{{ */
@@ -581,7 +594,7 @@ static int ping_read(void) /* {{{ */
 
     start_thread();
 
-    return (-1);
+    return -1;
   } /* if (ping_thread_error != 0) */
 
   for (hostlist_t *hl = hostlist_head; hl != NULL; hl = hl->next) /* {{{ */
@@ -642,7 +655,7 @@ static int ping_read(void) /* {{{ */
     submit(hl->host, "ping_droprate", droprate);
   } /* }}} for (hl = hostlist_head; hl != NULL; hl = hl->next) */
 
-  return (0);
+  return 0;
 } /* }}} int ping_read */
 
 static int ping_shutdown(void) /* {{{ */
@@ -651,7 +664,7 @@ static int ping_shutdown(void) /* {{{ */
 
   INFO("ping plugin: Shutting down thread.");
   if (stop_thread() < 0)
-    return (-1);
+    return -1;
 
   hl = hostlist_head;
   while (hl != NULL) {
@@ -670,7 +683,7 @@ static int ping_shutdown(void) /* {{{ */
     ping_data = NULL;
   }
 
-  return (0);
+  return 0;
 } /* }}} int ping_shutdown */
 
 void module_register(void) {