Wrap the content of macro with do/while to make it safer as per code review comment
[collectd.git] / src / utils_cmd_putval.c
index 15cd939..2522819 100644 (file)
 #include "utils_parse_option.h"
 
 #define print_to_socket(fh, ...) \
-       if (fprintf (fh, __VA_ARGS__) < 0) { \
-               char errbuf[1024]; \
-               WARNING ("handle_putval: failed to write to socket #%i: %s", \
-                               fileno (fh), sstrerror (errno, errbuf, sizeof (errbuf))); \
-               return -1; \
-       }
+    do { \
+        if (fprintf (fh, __VA_ARGS__) < 0) { \
+            char errbuf[1024]; \
+            WARNING ("handle_putval: failed to write to socket #%i: %s", \
+                    fileno (fh), sstrerror (errno, errbuf, sizeof (errbuf))); \
+            return -1; \
+        } \
+        fflush(fh); \
+    } while (0);
 
 static int dispatch_values (const data_set_t *ds, value_list_t *vl,
                FILE *fh, char *buffer)
@@ -56,16 +59,16 @@ static int set_option (value_list_t *vl, const char *key, const char *value)
 
        if (strcasecmp ("interval", key) == 0)
        {
-               int tmp;
+               double tmp;
                char *endptr;
 
                endptr = NULL;
                errno = 0;
-               tmp = strtol (value, &endptr, 0);
+               tmp = strtod (value, &endptr);
 
                if ((errno == 0) && (endptr != NULL)
-                               && (endptr != value) && (tmp > 0))
-                       vl->interval = tmp;
+                               && (endptr != value) && (tmp > 0.0))
+                       vl->interval = DOUBLE_TO_CDTIME_T (tmp);
        }
        else
                return (1);
@@ -246,9 +249,11 @@ int create_putval (char *ret, size_t ret_len, /* {{{ */
        escape_string (buffer_values, sizeof (buffer_values));
 
        ssnprintf (ret, ret_len,
-                       "PUTVAL %s interval=%i %s",
+                       "PUTVAL %s interval=%.3f %s",
                        buffer_ident,
-                       (vl->interval > 0) ? vl->interval : interval_g,
+                       (vl->interval > 0)
+                       ? CDTIME_T_TO_DOUBLE (vl->interval)
+                       : CDTIME_T_TO_DOUBLE (plugin_get_interval ()),
                        buffer_values);
 
        return (0);