* this preserves principle of least surprise when dealing with files that
authoroetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa>
Tue, 14 Oct 2008 19:08:56 +0000 (19:08 +0000)
committeroetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa>
Tue, 14 Oct 2008 19:08:56 +0000 (19:08 +0000)
   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.

git-svn-id: svn://svn.oetiker.ch/rrdtool/trunk/program@1604 a5681a0c-68f1-0310-ab6d-d61299d08faa

src/rrd_client.c

index 76fded0..5583bfe 100644 (file)
@@ -518,6 +518,7 @@ int rrdc_update (const char *filename, int values_num, /* {{{ */
   rrdc_response_t *res;
   int status;
   int i;
   rrdc_response_t *res;
   int status;
   int i;
+  char file_path[PATH_MAX];
 
   memset (buffer, 0, sizeof (buffer));
   buffer_ptr = &buffer[0];
 
   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);
 
   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);
   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;
   size_t buffer_size;
   rrdc_response_t *res;
   int status;
+  char file_path[PATH_MAX];
 
   if (filename == NULL)
     return (-1);
 
   if (filename == NULL)
     return (-1);
@@ -574,6 +580,10 @@ int rrdc_flush (const char *filename) /* {{{ */
   if (status != 0)
     return (ENOBUFS);
 
   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);
   status = buffer_add_string (filename, &buffer_ptr, &buffer_free);
   if (status != 0)
     return (ENOBUFS);