libcollectdclient: Implement the lcc_listval_with_selection() function. ff/ctlshow
authorFlorian Forster <octo@huhu.verplant.org>
Thu, 17 Mar 2011 08:42:38 +0000 (09:42 +0100)
committerFlorian Forster <octo@collectd.org>
Fri, 20 Sep 2013 13:53:45 +0000 (15:53 +0200)
This function exports the new selection feature of the LISTVAL command
with a straight forward C API. The existing lcc_listval() function
remains for backwards compatibility (and ease of use) and will
internally use the new and more complex function.

src/libcollectdclient/client.c
src/libcollectdclient/collectd/client.h

index 726f25d..d4b52e4 100644 (file)
@@ -863,9 +863,15 @@ int lcc_flush (lcc_connection_t *c, const char *plugin, /* {{{ */
 
 /* TODO: Implement lcc_putnotif */
 
-int lcc_listval (lcc_connection_t *c, /* {{{ */
+int lcc_listval_with_selection (lcc_connection_t *c, /* {{{ */
+    const char *re_host,
+    const char *re_plugin,
+    const char *re_plugin_instance,
+    const char *re_type,
+    const char *re_type_instance,
     lcc_identifier_t **ret_ident, size_t *ret_ident_num)
 {
+  char command[1024]; /* Buffer size copied from src/unixsock.c */
   lcc_response_t res;
   size_t i;
   int status;
@@ -882,7 +888,28 @@ int lcc_listval (lcc_connection_t *c, /* {{{ */
     return (-1);
   }
 
-  status = lcc_sendreceive (c, "LISTVAL", &res);
+  strncpy (command, "LISTVAL", sizeof (command));
+
+#define ADD_SELECTOR(field)                                                  \
+  if (re_##field != NULL)                                                    \
+  {                                                                          \
+    char tmp_re[sizeof (command)];                                           \
+      char tmp_cmd[sizeof (command)];                                        \
+      snprintf (tmp_cmd, sizeof (tmp_cmd), "%s %s=%s", command, #field,      \
+          lcc_strescape (tmp_re, re_##field, sizeof (tmp_re)));              \
+      memcpy (command, tmp_cmd, sizeof (command));                           \
+      command[sizeof (command) - 1] = 0;                                     \
+  }
+
+  ADD_SELECTOR (host)
+  ADD_SELECTOR (plugin)
+  ADD_SELECTOR (plugin_instance)
+  ADD_SELECTOR (type)
+  ADD_SELECTOR (type_instance)
+
+#undef ADD_SELECTOR
+
+  status = lcc_sendreceive (c, command, &res);
   if (status != 0)
     return (status);
 
@@ -944,6 +971,18 @@ int lcc_listval (lcc_connection_t *c, /* {{{ */
   *ret_ident_num = ident_num;
 
   return (0);
+} /* }}} int lcc_listval_with_selection */
+
+int lcc_listval (lcc_connection_t *c, /* {{{ */
+    lcc_identifier_t **ret_ident, size_t *ret_ident_num)
+{
+  return (lcc_listval_with_selection (c,
+        /* host            = */ NULL,
+        /* plugin          = */ NULL,
+        /* plugin_instance = */ NULL,
+        /* type            = */ NULL,
+        /* type_instance   = */ NULL,
+        ret_ident, ret_ident_num));
 } /* }}} int lcc_listval */
 
 const char *lcc_strerror (lcc_connection_t *c) /* {{{ */
index 6ae8598..d473e32 100644 (file)
@@ -112,6 +112,14 @@ int lcc_flush (lcc_connection_t *c, const char *plugin,
 int lcc_listval (lcc_connection_t *c,
     lcc_identifier_t **ret_ident, size_t *ret_ident_num);
 
+int lcc_listval_with_selection (lcc_connection_t *c,
+    const char *re_host,
+    const char *re_plugin,
+    const char *re_plugin_instance,
+    const char *re_type,
+    const char *re_type_instance,
+    lcc_identifier_t **ret_ident, size_t *ret_ident_num);
+
 /* TODO: putnotif */
 
 const char *lcc_strerror (lcc_connection_t *c);