src/daemon/common.[ch]: Implement the "read_file()" function.
[collectd.git] / src / daemon / common.c
index 535dfad..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)
 {
@@ -475,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);
@@ -968,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);
@@ -989,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);