[rrd-developers] [PATCH] rrdcached treats relative and absolute paths the same
kevin brintnall
kbrint at rufus.net
Tue Oct 14 14:37:08 CEST 2008
---
src/rrd_daemon.c | 33 +++++++++++++++++++++++++++++----
1 files changed, 29 insertions(+), 4 deletions(-)
diff --git a/src/rrd_daemon.c b/src/rrd_daemon.c
index 5c47ac1..8b23e52 100644
--- a/src/rrd_daemon.c
+++ b/src/rrd_daemon.c
@@ -956,6 +956,26 @@ err:
return 0;
} /* }}} static int check_file_access */
+/* when using a base dir, convert relative paths to absolute paths.
+ * if necessary, modifies the "filename" pointer to point
+ * to the new path created in "tmp". "tmp" is provided
+ * by the caller and sizeof(tmp) must be >= PATH_MAX.
+ *
+ * this allows us to optimize for the expected case (absolute path)
+ * with a no-op.
+ */
+static void get_abs_path(char **filename, char *tmp)
+{
+ assert(tmp != NULL);
+ assert(filename != NULL && *filename != NULL);
+
+ if (config_base_dir == NULL || **filename == '/')
+ return;
+
+ snprintf(tmp, PATH_MAX, "%s/%s", config_base_dir, *filename);
+ *filename = tmp;
+} /* }}} static int get_abs_path */
+
/* returns 1 if we have the required privilege level,
* otherwise issue an error to the user on sock */
static int has_privilege (listen_socket_t *sock, /* {{{ */
@@ -1183,7 +1203,7 @@ static int handle_request_stats (listen_socket_t *sock) /* {{{ */
static int handle_request_flush (listen_socket_t *sock, /* {{{ */
char *buffer, size_t buffer_size)
{
- char *file;
+ char *file, file_tmp[PATH_MAX];
int status;
status = buffer_get_field (&buffer, &buffer_size, &file);
@@ -1197,6 +1217,7 @@ static int handle_request_flush (listen_socket_t *sock, /* {{{ */
stats_flush_received++;
pthread_mutex_unlock(&stats_lock);
+ get_abs_path(&file, file_tmp);
if (!check_file_access(file, sock)) return 0;
status = flush_file (file);
@@ -1244,7 +1265,7 @@ static int handle_request_pending(listen_socket_t *sock, /* {{{ */
char *buffer, size_t buffer_size)
{
int status;
- char *file;
+ char *file, file_tmp[PATH_MAX];
cache_item_t *ci;
status = buffer_get_field(&buffer, &buffer_size, &file);
@@ -1256,6 +1277,8 @@ static int handle_request_pending(listen_socket_t *sock, /* {{{ */
if (status <= 0)
return status;
+ get_abs_path(&file, file_tmp);
+
pthread_mutex_lock(&cache_lock);
ci = g_tree_lookup(cache_tree, file);
if (ci == NULL)
@@ -1275,7 +1298,7 @@ static int handle_request_forget(listen_socket_t *sock, /* {{{ */
char *buffer, size_t buffer_size)
{
int status;
- char *file;
+ char *file, file_tmp[PATH_MAX];
status = buffer_get_field(&buffer, &buffer_size, &file);
if (status != 0)
@@ -1286,6 +1309,7 @@ static int handle_request_forget(listen_socket_t *sock, /* {{{ */
if (status <= 0)
return status;
+ get_abs_path(&file, file_tmp);
if (!check_file_access(file, sock)) return 0;
pthread_mutex_lock(&cache_lock);
@@ -1311,7 +1335,7 @@ static int handle_request_update (listen_socket_t *sock, /* {{{ */
time_t now,
char *buffer, size_t buffer_size)
{
- char *file;
+ char *file, file_tmp[PATH_MAX];
int values_num = 0;
int bad_timestamps = 0;
int status;
@@ -1335,6 +1359,7 @@ static int handle_request_update (listen_socket_t *sock, /* {{{ */
stats_updates_received++;
pthread_mutex_unlock(&stats_lock);
+ get_abs_path(&file, file_tmp);
if (!check_file_access(file, sock)) return 0;
pthread_mutex_lock (&cache_lock);
--
1.6.0.2
More information about the rrd-developers
mailing list