X-Git-Url: https://git.octo.it/?a=blobdiff_plain;ds=sidebyside;f=src%2Fapcups.c;h=a1f238266bb9848cc71494713612f04c4423ae28;hb=f3610533206238bf4fcb72c76e9a07517d8bc64b;hp=dc533f1e48eb3b741c2f37eeb6978694ff01aa96;hpb=3489284330462f4edc85a75445a5cc8014e29db0;p=collectd.git diff --git a/src/apcups.c b/src/apcups.c index dc533f1e..a1f23826 100644 --- a/src/apcups.c +++ b/src/apcups.c @@ -25,6 +25,7 @@ **/ #include "collectd.h" + #include "common.h" /* rrd_update_file */ #include "plugin.h" /* plugin_register, plugin_submit */ #include "configfile.h" /* cf_register */ @@ -32,9 +33,6 @@ #if HAVE_SYS_TYPES_H # include #endif -#if HAVE_SYS_SOCKET_H -# include -#endif #if HAVE_NETDB_H # include #endif @@ -43,6 +41,10 @@ # include #endif +#ifndef APCUPS_SERVER_TIMEOUT +# define APCUPS_SERVER_TIMEOUT 15.0 +#endif + #ifndef APCUPS_DEFAULT_NODE # define APCUPS_DEFAULT_NODE "localhost" #endif @@ -88,7 +90,7 @@ static int net_shutdown (int *fd) if ((fd == NULL) || (*fd < 0)) return (EINVAL); - swrite (*fd, (void *) &packet_size, sizeof (packet_size)); + (void)swrite (*fd, (void *) &packet_size, sizeof (packet_size)); close (*fd); *fd = -1; @@ -114,21 +116,20 @@ static int net_open (char const *node, char const *service) { int sd; int status; - struct addrinfo ai_hints; struct addrinfo *ai_return; struct addrinfo *ai_list; - /* Resolve name */ - memset (&ai_hints, 0, sizeof (ai_hints)); /* TODO: Change this to `AF_UNSPEC' if apcupsd can handle IPv6 */ - ai_hints.ai_family = AF_INET; - ai_hints.ai_socktype = SOCK_STREAM; + struct addrinfo ai_hints = { + .ai_family = AF_INET, + .ai_socktype = SOCK_STREAM + }; status = getaddrinfo (node, service, &ai_hints, &ai_return); if (status != 0) { char errbuf[1024]; - INFO ("getaddrinfo failed: %s", + INFO ("apcups plugin: getaddrinfo failed: %s", (status == EAI_SYSTEM) ? sstrerror (errno, errbuf, sizeof (errbuf)) : gai_strerror (status)); @@ -147,7 +148,7 @@ static int net_open (char const *node, char const *service) if (sd < 0) { - DEBUG ("Unable to open a socket"); + DEBUG ("apcups plugin: Unable to open a socket"); freeaddrinfo (ai_return); return (-1); } @@ -159,13 +160,13 @@ static int net_open (char const *node, char const *service) if (status != 0) /* `connect(2)' failed */ { char errbuf[1024]; - INFO ("connect failed: %s", + INFO ("apcups plugin: connect failed: %s", sstrerror (errno, errbuf, sizeof (errbuf))); close (sd); return (-1); } - DEBUG ("Done opening a socket %i", sd); + DEBUG ("apcups plugin: Done opening a socket %i", sd); return (sd); } /* int net_open */ @@ -223,7 +224,7 @@ static int net_recv (int *sockfd, char *buf, int buflen) * Returns zero on success * Returns non-zero on error */ -static int net_send (int *sockfd, char *buff, int len) +static int net_send (int *sockfd, const char *buff, int len) { uint16_t packet_size; @@ -325,9 +326,6 @@ static int apc_query_server (char const *node, char const *service, printf ("net_recv = `%s';\n", recvline); #endif /* if APCMAIN */ - if (strncmp ("END APC", recvline, strlen ("END APC")) == 0) - break; - toksaveptr = NULL; tokptr = strtok_r (recvline, " :\t", &toksaveptr); while (tokptr != NULL) @@ -384,6 +382,7 @@ static int apc_query_server (char const *node, char const *service, static int apcups_config (oconfig_item_t *ci) { int i; + _Bool persistent_conn_set = 0; for (i = 0; i < ci->children_num; i++) { @@ -395,16 +394,29 @@ static int apcups_config (oconfig_item_t *ci) cf_util_get_service (child, &conf_service); else if (strcasecmp (child->key, "ReportSeconds") == 0) cf_util_get_boolean (child, &conf_report_seconds); - else if (strcasecmp (child->key, "PersistentConnection") == 0) + else if (strcasecmp (child->key, "PersistentConnection") == 0) { cf_util_get_boolean (child, &conf_persistent_conn); + persistent_conn_set = 1; + } else ERROR ("apcups plugin: Unknown config option \"%s\".", child->key); } + if (!persistent_conn_set) { + double interval = CDTIME_T_TO_DOUBLE(plugin_get_interval()); + if (interval > APCUPS_SERVER_TIMEOUT) { + NOTICE ("apcups plugin: Plugin poll interval set to %.3f seconds. " + "Apcupsd NIS socket timeout is %.3f seconds, " + "PersistentConnection disabled by default.", + interval, APCUPS_SERVER_TIMEOUT); + conf_persistent_conn = 0; + } + } + return (0); } /* int apcups_config */ -static void apc_submit_generic (char *type, char *type_inst, double value) +static void apc_submit_generic (const char *type, const char *type_inst, double value) { value_t values[1]; value_list_t vl = VALUE_LIST_INIT; @@ -458,7 +470,7 @@ static int apcups_read (void) */ if (status != 0) { - DEBUG ("apc_query_server (%s, %s) = %i", + DEBUG ("apcups plugin: apc_query_server (%s, %s) = %i", (conf_node == NULL) ? APCUPS_DEFAULT_NODE : conf_node, (conf_service == NULL) ? APCUPS_DEFAULT_SERVICE : conf_service, status);