introduce "epoch" as a new base time reference, meaning timestamp 0.
[rrdtool.git] / src / rrd_daemon.c
index 9062927..0586a8d 100644 (file)
 #include <libgen.h>
 #include <grp.h>
 
+#ifdef HAVE_LIBWRAP
+#include <tcpd.h>
+#endif /* HAVE_LIBWRAP */
+
 #include <glib-2.0/glib.h>
 /* }}} */
 
@@ -1701,7 +1705,7 @@ static int handle_request_info (HANDLER_PROTO) /* {{{ */
 {
   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);
@@ -1714,11 +1718,11 @@ static int handle_request_info (HANDLER_PROTO) /* {{{ */
   }
   /* 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))
@@ -1739,8 +1743,10 @@ static int handle_request_info (HANDLER_PROTO) /* {{{ */
           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  */
 
@@ -2634,6 +2640,21 @@ static void *connection_thread_main (void *args) /* {{{ */
   }
 
   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);