src/rrd_daemon.c: Stat files before creating a tree-node for them.
[rrdtool.git] / src / rrd_daemon.c
index bc44b81..dfdd0e3 100644 (file)
@@ -558,10 +558,13 @@ static void *queue_thread_main (void *args __attribute__((unused))) /* {{{ */
     for (i = 0; i < values_num; i++)
       free (values[i]);
 
-    pthread_mutex_lock (&stats_lock);
-    stats_updates_written++;
-    stats_data_sets_written += values_num;
-    pthread_mutex_unlock (&stats_lock);
+    if (status == 0)
+    {
+      pthread_mutex_lock (&stats_lock);
+      stats_updates_written++;
+      stats_data_sets_written += values_num;
+      pthread_mutex_unlock (&stats_lock);
+    }
 
     pthread_mutex_lock (&cache_lock);
     pthread_cond_broadcast (&flush_cond);
@@ -906,6 +909,33 @@ static int handle_request_update (int fd, /* {{{ */
   ci = g_tree_lookup (cache_tree, file);
   if (ci == NULL) /* {{{ */
   {
+    struct stat statbuf;
+
+    memset (&statbuf, 0, sizeof (statbuf));
+    status = stat (file, &statbuf);
+    if (status != 0)
+    {
+      pthread_mutex_unlock (&cache_lock);
+      RRDD_LOG (LOG_ERR, "handle_request_update: stat (%s) failed.", file);
+
+      status = errno;
+      if (status == ENOENT)
+        snprintf (answer, sizeof (answer), "-1 No such file: %s", file);
+      else
+        snprintf (answer, sizeof (answer), "-1 stat failed with error %i.\n",
+            status);
+      RRDD_UPDATE_SEND;
+      return (0);
+    }
+    if (!S_ISREG (statbuf.st_mode))
+    {
+      pthread_mutex_unlock (&cache_lock);
+
+      snprintf (answer, sizeof (answer), "-1 Not a regular file: %s", file);
+      RRDD_UPDATE_SEND;
+      return (0);
+    }
+
     ci = (cache_item_t *) malloc (sizeof (cache_item_t));
     if (ci == NULL)
     {
@@ -1366,6 +1396,7 @@ static void *listen_thread_main (void *args __attribute__((unused))) /* {{{ */
       struct sockaddr_storage client_sa;
       socklen_t client_sa_size;
       pthread_t tid;
+      pthread_attr_t attr;
 
       if (pollfds[i].revents == 0)
         continue;
@@ -1394,7 +1425,10 @@ static void *listen_thread_main (void *args __attribute__((unused))) /* {{{ */
         continue;
       }
 
-      status = pthread_create (&tid, /* attr = */ NULL, connection_thread_main,
+      pthread_attr_init (&attr);
+      pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
+
+      status = pthread_create (&tid, &attr, connection_thread_main,
           /* args = */ (void *) client_sd);
       if (status != 0)
       {