src/daemon/common.[ch]: Implement the "read_file()" function.
[collectd.git] / src / daemon / common.c
index 5386739..84d8660 100644 (file)
@@ -1,6 +1,6 @@
 /**
  * collectd - src/common.c
- * Copyright (C) 2005-2014  Florian octo Forster
+ * Copyright (C) 2005-2015  Florian octo Forster
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -264,6 +264,39 @@ ssize_t sread (int fd, void *buf, size_t count)
        return (0);
 }
 
+int read_file (char const *file, void **ret_data, size_t *ret_data_size)
+{
+       int fd = open (file, O_RDONLY);
+       if (fd == -1)
+               return (-1);
+
+       struct stat statbuf = { 0 };
+       if (fstat (fd, &statbuf) == -1)
+       {
+               close (fd);
+               return (-1);
+       }
+
+       size_t data_size = (size_t) statbuf.st_size;
+       void *data = malloc (data_size);
+       if (data == NULL)
+       {
+               close (fd);
+               return (-1);
+       }
+
+       if (sread (fd, data, data_size) != 0)
+       {
+               close (fd);
+               sfree (data);
+               return (-1);
+       }
+
+       close (fd);
+       *ret_data = data;
+       *ret_data_size = data_size;
+       return (0);
+} /* }}} int read_file */
 
 ssize_t swrite (int fd, const void *buf, size_t count)
 {
@@ -373,6 +406,60 @@ int strsubstitute (char *str, char c_from, char c_to)
        return (ret);
 } /* int strsubstitute */
 
+int escape_string (char *buffer, size_t buffer_size)
+{
+  char *temp;
+  size_t i;
+  size_t j;
+
+  /* Check if we need to escape at all first */
+  temp = strpbrk (buffer, " \t\"\\");
+  if (temp == NULL)
+    return (0);
+
+  if (buffer_size < 3)
+    return (EINVAL);
+
+  temp = (char *) malloc (buffer_size);
+  if (temp == NULL)
+    return (ENOMEM);
+  memset (temp, 0, buffer_size);
+
+  temp[0] = '"';
+  j = 1;
+
+  for (i = 0; i < buffer_size; i++)
+  {
+    if (buffer[i] == 0)
+    {
+      break;
+    }
+    else if ((buffer[i] == '"') || (buffer[i] == '\\'))
+    {
+      if (j > (buffer_size - 4))
+        break;
+      temp[j] = '\\';
+      temp[j + 1] = buffer[i];
+      j += 2;
+    }
+    else
+    {
+      if (j > (buffer_size - 3))
+        break;
+      temp[j] = buffer[i];
+      j++;
+    }
+  }
+
+  assert ((j + 1) < buffer_size);
+  temp[j] = '"';
+  temp[j + 1] = 0;
+
+  sstrncpy (buffer, temp, buffer_size);
+  sfree (temp);
+  return (0);
+} /* int escape_string */
+
 int strunescape (char *buf, size_t buf_len)
 {
        size_t i;
@@ -421,8 +508,8 @@ size_t strstripnewline (char *buffer)
                if ((buffer[buffer_len - 1] != '\n')
                                && (buffer[buffer_len - 1] != '\r'))
                        break;
-               buffer[buffer_len] = 0;
                buffer_len--;
+               buffer[buffer_len] = 0;
        }
 
        return (buffer_len);
@@ -914,18 +1001,17 @@ int format_values (char *ret, size_t ret_len, /* {{{ */
         for (i = 0; i < ds->ds_num; i++)
         {
                 if (ds->ds[i].type == DS_TYPE_GAUGE)
-                        BUFFER_ADD (":%f", vl->values[i].gauge);
+                        BUFFER_ADD (":"GAUGE_FORMAT, vl->values[i].gauge);
                 else if (store_rates)
                 {
                         if (rates == NULL)
                                 rates = uc_get_rate (ds, vl);
                         if (rates == NULL)
                         {
-                                WARNING ("format_values: "
-                                               "uc_get_rate failed.");
+                                WARNING ("format_values: uc_get_rate failed.");
                                 return (-1);
                         }
-                        BUFFER_ADD (":%g", rates[i]);
+                        BUFFER_ADD (":"GAUGE_FORMAT, rates[i]);
                 }
                 else if (ds->ds[i].type == DS_TYPE_COUNTER)
                         BUFFER_ADD (":%llu", vl->values[i].counter);
@@ -935,7 +1021,7 @@ int format_values (char *ret, size_t ret_len, /* {{{ */
                         BUFFER_ADD (":%"PRIu64, vl->values[i].absolute);
                 else
                 {
-                        ERROR ("format_values plugin: Unknown data source type: %i",
+                        ERROR ("format_values: Unknown data source type: %i",
                                         ds->ds[i].type);
                         sfree (rates);
                         return (-1);