summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 672a5d8)
raw | patch | inline | side by side (parent: 672a5d8)
author | oetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa> | |
Tue, 14 Oct 2008 19:08:00 +0000 (19:08 +0000) | ||
committer | oetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa> | |
Tue, 14 Oct 2008 19:08:00 +0000 (19:08 +0000) |
CONTRIBUTORS | patch | blob | history | |
src/rrd_daemon.c | patch | blob | history |
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index 8c3e4be410d4b0a3d02fb14c290489e77827b935..4c668b7a701f814a34885a5e8be58feba9316f5f 100644 (file)
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
Christophe VG <Christophe.VanGinneken with ubizen.com>
Christophe Van Ginneken <Christophe.VanGinneken with ubizen.com> (--no-legend)
Dan Dunn <dandunn with computer.org>
+Daniel Pocock <daniel in pocock.com.au> rrd_create to mmap port
Dave Bodenstab <dave@bodenstab.org> AT style time in update, tclfixes
David Grimes <dgrimes with navisite.com> SQRT/SORT/REV/SHIFT/TREND
David L. Barker <dave with ncomtech.com> xport function bug fixes
diff --git a/src/rrd_daemon.c b/src/rrd_daemon.c
index 5c47ac1fd7b3908edce814a15631c1768e571442..8b23e5202a236676978b09ae1baaa6d9e4c35074 100644 (file)
--- a/src/rrd_daemon.c
+++ b/src/rrd_daemon.c
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, /* {{{ */
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);
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);
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);
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)
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)
if (status <= 0)
return status;
+ get_abs_path(&file, file_tmp);
if (!check_file_access(file, sock)) return 0;
pthread_mutex_lock(&cache_lock);
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;
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);