exec plugin: Really remove STDERR from the select() set.
authorFlorian Forster <octo@collectd.org>
Wed, 12 Sep 2012 16:25:20 +0000 (18:25 +0200)
committerFlorian Forster <octo@collectd.org>
Wed, 12 Sep 2012 16:26:22 +0000 (18:26 +0200)
select(2) is actually using a variable called "copy", which we didn't set in
this case.

Fixes Github issue #12. Thanks to Tetsuya Kawaguchi for reporting this problem.

src/exec.c

index dd295e9..5274797 100644 (file)
@@ -637,17 +637,22 @@ static void *exec_read_one (void *arg) /* {{{ */
 
       if (len < 0)
       {
-        if (errno == EAGAIN || errno == EINTR)  continue;
+        if (errno == EAGAIN || errno == EINTR)
+          continue;
         break;
       }
       else if (len == 0)
       {
         /* We've reached EOF */
-        NOTICE ("exec plugin: Program `%s' has closed STDERR.",
-            pl->exec);
-        close (fd_err);
+        NOTICE ("exec plugin: Program `%s' has closed STDERR.", pl->exec);
+
+        /* Remove file descriptor form select() set. */
         FD_CLR (fd_err, &fdset);
+        copy = fdset;
         highest_fd = fd;
+
+        /* Clean up file descriptor */
+        close (fd_err);
         fd_err = -1;
         continue;
       }