Merge branch 'collectd-5.5' into collectd-5.6
[collectd.git] / src / apcups.c
index b4bc099..af5f24c 100644 (file)
@@ -25,9 +25,9 @@
  **/
 
 #include "collectd.h"
+
 #include "common.h"      /* rrd_update_file */
 #include "plugin.h"      /* plugin_register, plugin_submit */
-#include "configfile.h"  /* cf_register */
 
 #if HAVE_SYS_TYPES_H
 # include <sys/types.h>
 # include <netinet/in.h>
 #endif
 
+#ifndef APCUPS_SERVER_TIMEOUT
+# define APCUPS_SERVER_TIMEOUT 15.0
+#endif
+
 #ifndef APCUPS_DEFAULT_NODE
 # define APCUPS_DEFAULT_NODE "localhost"
 #endif
@@ -85,7 +89,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;
 
@@ -111,15 +115,14 @@ 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)
@@ -322,9 +325,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)
@@ -380,9 +380,9 @@ 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++)
+       for (int i = 0; i < ci->children_num; i++)
        {
                oconfig_item_t *child = ci->children + i;
 
@@ -392,12 +392,25 @@ 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 */