X-Git-Url: https://git.octo.it/?p=collectd.git;a=blobdiff_plain;f=src%2Fping.c;h=ffb16910eaff3655d7326e30592595dc1da31410;hp=82de59f0fd0d7310cad6309e4f092129b047ccad;hb=ec51ddee94fa2ba1e01fe0e336ccc9c190a198ff;hpb=e4504c3cc5582ab915903e1b4ba010545ffc8354 diff --git a/src/ping.c b/src/ping.c index 82de59f0..ffb16910 100644 --- a/src/ping.c +++ b/src/ping.c @@ -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) { @@ -679,5 +692,3 @@ void module_register(void) { plugin_register_read("ping", ping_read); plugin_register_shutdown("ping", ping_shutdown); } /* void module_register */ - -/* vim: set sw=2 sts=2 et fdm=marker : */