unixsock plugin: Moved the `parse_identifier' code to `common.c'
authorFlorian Forster <octo@leeloo.lan.home.verplant.org>
Thu, 31 May 2007 21:16:06 +0000 (23:16 +0200)
committerFlorian Forster <octo@leeloo.lan.home.verplant.org>
Thu, 31 May 2007 21:16:06 +0000 (23:16 +0200)
The new function `parse_values' in `common.c' can be used to parse
`time:value0:value1:...', as used by RRDTool, the unixsock plugin and, in the
very near future, the exec plugin.

src/common.c
src/common.h
src/perl.c
src/unixsock.c

index 9a28cdb..1addb32 100644 (file)
@@ -555,3 +555,91 @@ int format_name (char *ret, int ret_len,
                return (-1);
        return (0);
 } /* int format_name */
+
+int parse_identifier (char *str, char **ret_host,
+               char **ret_plugin, char **ret_plugin_instance,
+               char **ret_type, char **ret_type_instance)
+{
+       char *hostname = NULL;
+       char *plugin = NULL;
+       char *plugin_instance = NULL;
+       char *type = NULL;
+       char *type_instance = NULL;
+
+       hostname = str;
+       if (hostname == NULL)
+               return (-1);
+
+       plugin = strchr (hostname, '/');
+       if (plugin == NULL)
+               return (-1);
+       *plugin = '\0'; plugin++;
+
+       type = strchr (plugin, '/');
+       if (type == NULL)
+               return (-1);
+       *type = '\0'; type++;
+
+       plugin_instance = strchr (plugin, '-');
+       if (plugin_instance != NULL)
+       {
+               *plugin_instance = '\0';
+               plugin_instance++;
+       }
+
+       type_instance = strchr (type, '-');
+       if (type_instance != NULL)
+       {
+               *type_instance = '\0';
+               type_instance++;
+       }
+
+       *ret_host = hostname;
+       *ret_plugin = plugin;
+       *ret_plugin_instance = plugin_instance;
+       *ret_type = type;
+       *ret_type_instance = type_instance;
+       return (0);
+} /* int parse_identifier */
+
+int parse_values (char *buffer, value_list_t *vl, const data_set_t *ds)
+{
+       int i;
+       char *dummy;
+       char *ptr;
+       char *saveptr;
+
+       i = -1;
+       dummy = buffer;
+       saveptr = NULL;
+       while ((ptr = strtok_r (dummy, ":", &saveptr)) != NULL)
+       {
+               dummy = NULL;
+
+               if (i >= vl->values_len)
+                       break;
+
+               if (i == -1)
+               {
+                       if (strcmp ("N", ptr) == 0)
+                               vl->time = time (NULL);
+                       else
+                               vl->time = (time_t) atoi (ptr);
+               }
+               else
+               {
+                       if (strcmp ("U", ptr) == 0)
+                               vl->values[i].gauge = NAN;
+                       else if (ds->ds[i].type == DS_TYPE_COUNTER)
+                               vl->values[i].counter = atoll (ptr);
+                       else if (ds->ds[i].type == DS_TYPE_GAUGE)
+                               vl->values[i].gauge = atof (ptr);
+               }
+
+               i++;
+       } /* while (strtok_r) */
+
+       if ((ptr != NULL) || (i != vl->values_len))
+               return (-1);
+       return (0);
+} /* int parse_values */
index 7808ac9..b07db9d 100644 (file)
@@ -24,6 +24,7 @@
 #define COMMON_H
 
 #include "collectd.h"
+#include "plugin.h"
 
 #define sfree(ptr) \
        if((ptr) != NULL) { \
@@ -166,4 +167,9 @@ int format_name (char *ret, int ret_len,
        format_name (ret, ret_len, (vl)->host, (vl)->plugin, (vl)->plugin_instance, \
                        (ds)->type, (vl)->type_instance)
 
+int parse_identifier (char *str, char **ret_host,
+               char **ret_plugin, char **ret_plugin_instance,
+               char **ret_type, char **ret_type_instance);
+int parse_values (char *buffer, value_list_t *vl, const data_set_t *ds);
+
 #endif /* COMMON_H */
index bcf7bb1..1ad7248 100644 (file)
@@ -25,7 +25,6 @@
  */
 
 #include "collectd.h"
-#include "common.h"
 
 #include "configfile.h"
 
@@ -41,6 +40,7 @@
 
 /* ... while we want the definition found in plugin.h. */
 #include "plugin.h"
+#include "common.h"
 
 #define PLUGIN_INIT     0
 #define PLUGIN_READ     1
index 9793659..215abdd 100644 (file)
@@ -84,52 +84,6 @@ static unsigned int     cache_oldest = UINT_MAX;
 /*
  * Functions
  */
-static int parse_identifier (char *str, char **ret_host,
-               char **ret_plugin, char **ret_plugin_instance,
-               char **ret_type, char **ret_type_instance)
-{
-       char *hostname = NULL;
-       char *plugin = NULL;
-       char *plugin_instance = NULL;
-       char *type = NULL;
-       char *type_instance = NULL;
-
-       hostname = str;
-       if (hostname == NULL)
-               return (-1);
-
-       plugin = strchr (hostname, '/');
-       if (plugin == NULL)
-               return (-1);
-       *plugin = '\0'; plugin++;
-
-       type = strchr (plugin, '/');
-       if (type == NULL)
-               return (-1);
-       *type = '\0'; type++;
-
-       plugin_instance = strchr (plugin, '-');
-       if (plugin_instance != NULL)
-       {
-               *plugin_instance = '\0';
-               plugin_instance++;
-       }
-
-       type_instance = strchr (type, '-');
-       if (type_instance != NULL)
-       {
-               *type_instance = '\0';
-               type_instance++;
-       }
-
-       *ret_host = hostname;
-       *ret_plugin = plugin;
-       *ret_plugin_instance = plugin_instance;
-       *ret_type = type;
-       *ret_type_instance = type_instance;
-       return (0);
-} /* int parse_identifier */
-
 static value_cache_t *cache_search (const char *name)
 {
        value_cache_t *vc;
@@ -568,12 +522,12 @@ static int us_handle_putval (FILE *fh, char **fields, int fields_num)
                return (-1);
        }
 
-       if ((strlen (hostname) > sizeof (vl.host))
-                       || (strlen (plugin) > sizeof (vl.plugin))
+       if ((strlen (hostname) >= sizeof (vl.host))
+                       || (strlen (plugin) >= sizeof (vl.plugin))
                        || ((plugin_instance != NULL)
-                               && (strlen (plugin_instance) > sizeof (vl.plugin_instance)))
+                               && (strlen (plugin_instance) >= sizeof (vl.plugin_instance)))
                        || ((type_instance != NULL)
-                               && (strlen (type_instance) > sizeof (vl.type_instance))))
+                               && (strlen (type_instance) >= sizeof (vl.type_instance))))
        {
                fprintf (fh, "-1 Identifier too long.");
                return (-1);