[rrd-developers] [PATCH] client of rrdcached will resolve relative paths to absolute

kevin brintnall kbrint at rufus.net
Tue Oct 14 14:37:10 CEST 2008


 * this preserves principle of least surprise when dealing with files that
   are reachable via many path strings.  i.e. when $PWD=/base/dir the
   following files are the same:

	/base/dir/x.rrd
	x.rrd
	../dir/x.rrd

 * for performance, absolute paths (starting with '/') are not resolved.
   this reduces the number of stat(2) system calls.
---
 src/rrd_client.c |   10 ++++++++++
 1 files changed, 10 insertions(+), 0 deletions(-)

diff --git a/src/rrd_client.c b/src/rrd_client.c
index 76fded0..5583bfe 100644
--- a/src/rrd_client.c
+++ b/src/rrd_client.c
@@ -518,6 +518,7 @@ int rrdc_update (const char *filename, int values_num, /* {{{ */
   rrdc_response_t *res;
   int status;
   int i;
+  char file_path[PATH_MAX];
 
   memset (buffer, 0, sizeof (buffer));
   buffer_ptr = &buffer[0];
@@ -527,6 +528,10 @@ int rrdc_update (const char *filename, int values_num, /* {{{ */
   if (status != 0)
     return (ENOBUFS);
 
+  /* change to absolute path for rrdcached */
+  if (*filename != '/' && realpath(filename, file_path) != NULL)
+      filename = file_path;
+
   status = buffer_add_string (filename, &buffer_ptr, &buffer_free);
   if (status != 0)
     return (ENOBUFS);
@@ -562,6 +567,7 @@ int rrdc_flush (const char *filename) /* {{{ */
   size_t buffer_size;
   rrdc_response_t *res;
   int status;
+  char file_path[PATH_MAX];
 
   if (filename == NULL)
     return (-1);
@@ -574,6 +580,10 @@ int rrdc_flush (const char *filename) /* {{{ */
   if (status != 0)
     return (ENOBUFS);
 
+  /* change to absolute path for rrdcached */
+  if (*filename != '/' && realpath(filename, file_path) != NULL)
+      filename = file_path;
+
   status = buffer_add_string (filename, &buffer_ptr, &buffer_free);
   if (status != 0)
     return (ENOBUFS);
-- 
1.6.0.2



More information about the rrd-developers mailing list