Merge branch 'collectd-5.7' into collectd-5.8
[collectd.git] / src / multimeter.c
index 02fe1ad..fc69e02 100644 (file)
 #include "common.h"
 #include "plugin.h"
 
-#if HAVE_TERMIOS_H && HAVE_SYS_IOCTL_H && HAVE_MATH_H
-# include <termios.h>
-# include <sys/ioctl.h>
-# include <math.h>
+#if HAVE_TERMIOS_H && HAVE_SYS_IOCTL_H
+#include <sys/ioctl.h>
+#include <termios.h>
 #else
-# error "No applicable input method."
+#error "No applicable input method."
 #endif
 
 static int fd = -1;
 
 #define LINE_LENGTH 14
-static int multimeter_read_value(double *value)
-{
-       int retry = 3; /* sometimes we receive garbadge */
-
-       do
-       {
-               struct timeval time_end;
-
-               tcflush(fd, TCIFLUSH);
-
-               if (gettimeofday (&time_end, NULL) < 0)
-               {
-                       char errbuf[1024];
-                       ERROR ("multimeter plugin: gettimeofday failed: %s",
-                                       sstrerror (errno, errbuf,
-                                               sizeof (errbuf)));
-                       return (-1);
-               }
-               time_end.tv_sec++;      
-
-               while (1)
-               {
-                       char buf[LINE_LENGTH];
-                       char *range;
-                       int status;
-                       fd_set rfds;
-                       struct timeval timeout;
-                       struct timeval time_now;
-
-                       status = swrite (fd, "D", 1);
-                       if (status < 0)
-                       {
-                               ERROR ("multimeter plugin: swrite failed.");
-                               return (-1);
-                       }
-
-                       FD_ZERO(&rfds);
-                       FD_SET(fd, &rfds);
-
-                       if (gettimeofday (&time_now, NULL) < 0)
-                       {
-                               char errbuf[1024];
-                               ERROR ("multimeter plugin: "
-                                               "gettimeofday failed: %s",
-                                               sstrerror (errno, errbuf,
-                                                       sizeof (errbuf)));
-                               return (-1);
-                       }
-                       if (timeval_cmp (time_end, time_now, &timeout) < 0)
-                               break;
-
-                       status = select(fd+1, &rfds, NULL, NULL, &timeout);
-
-                       if (status > 0) /* usually we succeed */
-                       {
-                               status = read(fd, buf, LINE_LENGTH);
-
-                               if ((status < 0) && ((errno == EAGAIN) || (errno == EINTR)))
-                                       continue;
-
-                               /* Format: "DC 00.000mV  \r" */
-                               if (status > 0 && status == LINE_LENGTH)
-                               {
-                                       *value = strtod(buf + 2, &range);
-
-                                       if ( range > (buf + 6) )
-                                       {
-                                               range = buf + 9;
-
-                                               switch ( *range )
-                                               {
-                                                       case 'p': *value *= 1.0E-12; break;
-                                                       case 'n': *value *= 1.0E-9; break;
-                                                       case 'u': *value *= 1.0E-6; break;
-                                                       case 'm': *value *= 1.0E-3; break;
-                                                       case 'k': *value *= 1.0E3; break;
-                                                       case 'M': *value *= 1.0E6; break;
-                                                       case 'G': *value *= 1.0E9; break;
-                                               }
-                                       }
-                                       else
-                                               return (-1); /* Overflow */
-
-                                       return (0); /* value received */
-                               }
-                               else break;
-                       }
-                       else if (!status) /* Timeout */
-                       {
-                               break;
-                       }
-                       else if ((status == -1) && ((errno == EAGAIN) || (errno == EINTR)))
-                       {
-                               continue;
-                       }
-                       else /* status == -1 */
-                       {
-                               char errbuf[1024];
-                               ERROR ("multimeter plugin: "
-                                               "select failed: %s",
-                                               sstrerror (errno, errbuf, sizeof (errbuf)));
-                               break;
-                       }
-               }
-       } while (--retry);
-
-       return (-2);  /* no value received */
+static int multimeter_read_value(double *value) {
+  int retry = 3; /* sometimes we receive garbadge */
+
+  do {
+    struct timeval time_end;
+
+    tcflush(fd, TCIFLUSH);
+
+    if (gettimeofday(&time_end, NULL) < 0) {
+      char errbuf[1024];
+      ERROR("multimeter plugin: gettimeofday failed: %s",
+            sstrerror(errno, errbuf, sizeof(errbuf)));
+      return -1;
+    }
+    time_end.tv_sec++;
+
+    while (1) {
+      char buf[LINE_LENGTH];
+      char *range;
+      int status;
+      fd_set rfds;
+      struct timeval timeout;
+      struct timeval time_now;
+
+      status = swrite(fd, "D", 1);
+      if (status != 0) {
+        ERROR("multimeter plugin: swrite failed.");
+        return -1;
+      }
+
+      FD_ZERO(&rfds);
+      FD_SET(fd, &rfds);
+
+      if (gettimeofday(&time_now, NULL) < 0) {
+        char errbuf[1024];
+        ERROR("multimeter plugin: "
+              "gettimeofday failed: %s",
+              sstrerror(errno, errbuf, sizeof(errbuf)));
+        return -1;
+      }
+      if (timeval_cmp(time_end, time_now, &timeout) < 0)
+        break;
+
+      status = select(fd + 1, &rfds, NULL, NULL, &timeout);
+
+      if (status > 0) /* usually we succeed */
+      {
+        status = read(fd, buf, LINE_LENGTH);
+
+        if ((status < 0) && ((errno == EAGAIN) || (errno == EINTR)))
+          continue;
+
+        /* Format: "DC 00.000mV  \r" */
+        if (status > 0 && status == LINE_LENGTH) {
+          *value = strtod(buf + 2, &range);
+
+          if (range > (buf + 6)) {
+            range = buf + 9;
+
+            switch (*range) {
+            case 'p':
+              *value *= 1.0E-12;
+              break;
+            case 'n':
+              *value *= 1.0E-9;
+              break;
+            case 'u':
+              *value *= 1.0E-6;
+              break;
+            case 'm':
+              *value *= 1.0E-3;
+              break;
+            case 'k':
+              *value *= 1.0E3;
+              break;
+            case 'M':
+              *value *= 1.0E6;
+              break;
+            case 'G':
+              *value *= 1.0E9;
+              break;
+            }
+          } else
+            return -1; /* Overflow */
+
+          return 0; /* value received */
+        } else
+          break;
+      } else if (!status) /* Timeout */
+      {
+        break;
+      } else if ((status == -1) && ((errno == EAGAIN) || (errno == EINTR))) {
+        continue;
+      } else /* status == -1 */
+      {
+        char errbuf[1024];
+        ERROR("multimeter plugin: "
+              "select failed: %s",
+              sstrerror(errno, errbuf, sizeof(errbuf)));
+        break;
+      }
+    }
+  } while (--retry);
+
+  return -2; /* no value received */
 } /* int multimeter_read_value */
 
-static int multimeter_init (void)
-{
-       char device[] = "/dev/ttyS ";
-
-       for (int i = 0; i < 10; i++)
-       {
-               device[strlen(device)-1] = i + '0';
-
-               if ((fd = open(device, O_RDWR | O_NOCTTY)) != -1)
-               {
-                       struct termios tios = { 0 };
-                       int rts = TIOCM_RTS;
-                       double value;
-
-                       tios.c_cflag = B1200 | CS7 | CSTOPB | CREAD | CLOCAL;
-                       tios.c_iflag = IGNBRK | IGNPAR;
-                       tios.c_oflag = 0;
-                       tios.c_lflag = 0;
-                       tios.c_cc[VTIME] = 3;
-                       tios.c_cc[VMIN]  = LINE_LENGTH;
-
-                       tcflush(fd, TCIFLUSH);
-                       tcsetattr(fd, TCSANOW, &tios);
-                       ioctl(fd, TIOCMBIC, &rts);
-
-                       if (multimeter_read_value (&value) < -1)
-                       {
-                               close (fd);
-                               fd = -1;
-                       }
-                       else
-                       {
-                               INFO ("multimeter plugin: Device "
-                                               "found at %s", device);
-                               return (0);
-                       }
-               }
-       }
-
-       ERROR ("multimeter plugin: No device found");
-       return (-1);
+static int multimeter_init(void) {
+  char device[] = "/dev/ttyS ";
+
+  for (int i = 0; i < 10; i++) {
+    device[strlen(device) - 1] = i + '0';
+
+    if ((fd = open(device, O_RDWR | O_NOCTTY)) != -1) {
+      struct termios tios = {0};
+      int rts = TIOCM_RTS;
+      double value;
+
+      tios.c_cflag = B1200 | CS7 | CSTOPB | CREAD | CLOCAL;
+      tios.c_iflag = IGNBRK | IGNPAR;
+      tios.c_oflag = 0;
+      tios.c_lflag = 0;
+      tios.c_cc[VTIME] = 3;
+      tios.c_cc[VMIN] = LINE_LENGTH;
+
+      tcflush(fd, TCIFLUSH);
+      tcsetattr(fd, TCSANOW, &tios);
+      ioctl(fd, TIOCMBIC, &rts);
+
+      if (multimeter_read_value(&value) < -1) {
+        close(fd);
+        fd = -1;
+      } else {
+        INFO("multimeter plugin: Device "
+             "found at %s",
+             device);
+        return 0;
+      }
+    }
+  }
+
+  ERROR("multimeter plugin: No device found");
+  return -1;
 }
 #undef LINE_LENGTH
 
-static void multimeter_submit (double value)
-{
-       value_t values[1];
-       value_list_t vl = VALUE_LIST_INIT;
+static void multimeter_submit(double value) {
+  value_list_t vl = VALUE_LIST_INIT;
 
-       values[0].gauge = value;
+  vl.values = &(value_t){.gauge = value};
+  vl.values_len = 1;
+  sstrncpy(vl.plugin, "multimeter", sizeof(vl.plugin));
+  sstrncpy(vl.type, "multimeter", sizeof(vl.type));
 
-       vl.values = values;
-       vl.values_len = 1;
-       sstrncpy (vl.host, hostname_g, sizeof (vl.host));
-       sstrncpy (vl.plugin, "multimeter", sizeof (vl.plugin));
-       sstrncpy (vl.type, "multimeter", sizeof (vl.type));
-
-       plugin_dispatch_values (&vl);
+  plugin_dispatch_values(&vl);
 }
 
-static int multimeter_read (void)
-{
-       double value;
+static int multimeter_read(void) {
+  double value;
 
-       if (fd < 0)
-               return (-1);
+  if (fd < 0)
+    return -1;
 
-       if (multimeter_read_value (&value) != 0)
-               return (-1);
+  if (multimeter_read_value(&value) != 0)
+    return -1;
 
-       multimeter_submit (value);
-       return (0);
+  multimeter_submit(value);
+  return 0;
 } /* int multimeter_read */
 
-static int multimeter_shutdown (void)
-{
-       if (fd >= 0)
-       {
-               close (fd);
-               fd = -1;
-       }
+static int multimeter_shutdown(void) {
+  if (fd >= 0) {
+    close(fd);
+    fd = -1;
+  }
 
-       return (0);
+  return 0;
 }
 
-void module_register (void)
-{
-       plugin_register_init ("multimeter", multimeter_init);
-       plugin_register_read ("multimeter", multimeter_read);
-       plugin_register_shutdown ("multimeter", multimeter_shutdown);
+void module_register(void) {
+  plugin_register_init("multimeter", multimeter_init);
+  plugin_register_read("multimeter", multimeter_read);
+  plugin_register_shutdown("multimeter", multimeter_shutdown);
 } /* void module_register */