#include <libgen.h>
#include <grp.h>
+#ifdef HAVE_LIBWRAP
+#include <tcpd.h>
+#endif /* HAVE_LIBWRAP */
+
#include <glib-2.0/glib.h>
/* }}} */
{
char *file, file_tmp[PATH_MAX];
int status;
- rrd_info_t *data;
+ rrd_info_t *info;
/* obtain filename */
status = buffer_get_field(&buffer, &buffer_size, &file);
}
/* get data */
rrd_clear_error ();
- data = rrd_info_r(file);
- if(!data) {
+ info = rrd_info_r(file);
+ if(!info) {
return send_response(sock, RESP_ERR, "RRD Error: %s\n", rrd_get_error());
}
- while (data) {
+ for (rrd_info_t *data = info; data != NULL; data = data->next) {
switch (data->type) {
case RD_I_VAL:
if (isnan(data->value.u_val))
add_response_info(sock,"%s %d %lu\n", data->key, data->type, data->value.u_blo.size);
break;
}
- data = data->next;
}
+
+ rrd_info_free(info);
+
return send_response(sock, RESP_OK, "Info for %s follows\n",file);
} /* }}} static int handle_request_info */
}
pthread_mutex_lock (&connection_threads_lock);
+#ifdef HAVE_LIBWRAP
+ /* LIBWRAP does not support multiple threads! By putting this code
+ inside pthread_mutex_lock we do not have to worry about request_info
+ getting overwritten by another thread.
+ */
+ struct request_info req;
+ request_init(&req, RQ_DAEMON, "rrdcache\0", RQ_FILE, fd, NULL );
+ fromhost(&req);
+ if(!hosts_access(&req)) {
+ RRDD_LOG(LOG_INFO, "refused connection from %s", eval_client(&req));
+ pthread_mutex_unlock (&connection_threads_lock);
+ close_connection(sock);
+ return NULL;
+ }
+#endif /* HAVE_LIBWRAP */
connection_threads_num++;
pthread_mutex_unlock (&connection_threads_lock);