libdns: Hack to skip negation term.
[gnupg.git] / dirmngr / ldap-wrapper.c
index 203b472..b313848 100644 (file)
@@ -15,7 +15,7 @@
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ * along with this program; if not, see <https://www.gnu.org/licenses/>.
  */
 
 /*
@@ -160,7 +160,7 @@ destroy_wrapper (struct wrapper_context_s *ctx)
 
 /* Print the content of LINE to thye log stream but make sure to only
    print complete lines.  Using NULL for LINE will flush any pending
-   output.  LINE may be modified by this fucntion. */
+   output.  LINE may be modified by this function. */
 static void
 print_log_line (struct wrapper_context_s *ctx, char *line)
 {
@@ -234,7 +234,7 @@ read_log_data (struct wrapper_context_s *ctx)
     {
       if (n < 0)
         log_error (_("error reading log from ldap wrapper %d: %s\n"),
-                   ctx->pid, strerror (errno));
+                   (int)ctx->pid, strerror (errno));
       print_log_line (ctx, NULL);
       SAFE_CLOSE (ctx->log_fd);
       return 1;
@@ -259,26 +259,12 @@ ldap_wrapper_thread (void *dummy)
   struct timespec abstime;
   struct timespec curtime;
   struct timespec timeout;
-  int saved_errno;
-  fd_set fdset, read_fdset;
+  fd_set fdset;
   int ret;
   time_t exptime;
 
   (void)dummy;
 
-  FD_ZERO (&fdset);
-  nfds = -1;
-  for (ctx = wrapper_list; ctx; ctx = ctx->next)
-    {
-      if (ctx->log_fd != -1)
-       {
-         FD_SET (ctx->log_fd, &fdset);
-         if (ctx->log_fd > nfds)
-           nfds = ctx->log_fd;
-       }
-    }
-  nfds++;
-
   npth_clock_gettime (&abstime);
   abstime.tv_sec += TIMERTICK_INTERVAL;
 
@@ -286,38 +272,42 @@ ldap_wrapper_thread (void *dummy)
     {
       int any_action = 0;
 
-      /* POSIX says that fd_set should be implemented as a structure,
-         thus a simple assignment is fine to copy the entire set.  */
-      read_fdset = fdset;
-
       npth_clock_gettime (&curtime);
       if (!(npth_timercmp (&curtime, &abstime, <)))
        {
          /* Inactivity is checked below.  Nothing else to do.  */
-         // handle_tick ();
          npth_clock_gettime (&abstime);
          abstime.tv_sec += TIMERTICK_INTERVAL;
        }
       npth_timersub (&abstime, &curtime, &timeout);
 
+      FD_ZERO (&fdset);
+      nfds = -1;
+      for (ctx = wrapper_list; ctx; ctx = ctx->next)
+        {
+          if (ctx->log_fd != -1)
+            {
+              FD_SET (ctx->log_fd, &fdset);
+              if (ctx->log_fd > nfds)
+                nfds = ctx->log_fd;
+            }
+        }
+      nfds++;
+
       /* FIXME: For Windows, we have to use a reader thread on the
         pipe that signals an event (and a npth_select_ev variant).  */
-      ret = npth_pselect (nfds + 1, &read_fdset, NULL, NULL, &timeout, NULL);
-      saved_errno = errno;
-
-      if (ret == -1 && saved_errno != EINTR)
+      ret = npth_pselect (nfds + 1, &fdset, NULL, NULL, &timeout, NULL);
+      if (ret == -1)
        {
-          log_error (_("npth_select failed: %s - waiting 1s\n"),
-                     strerror (saved_errno));
-          npth_sleep (1);
+          if (errno != EINTR)
+            {
+              log_error (_("npth_select failed: %s - waiting 1s\n"),
+                         strerror (errno));
+              npth_sleep (1);
+            }
           continue;
        }
 
-      if (ret <= 0)
-       /* Interrupt or timeout.  Will be handled when calculating the
-          next timeout.  */
-       continue;
-
       /* All timestamps before exptime should be considered expired.  */
       exptime = time (NULL);
       if (exptime > INACTIVITY_TIMEOUT)
@@ -331,10 +321,13 @@ ldap_wrapper_thread (void *dummy)
       for (ctx = wrapper_list; ctx; ctx = ctx->next)
         {
           /* Check whether there is any logging to be done. */
-          if (nfds && ctx->log_fd != -1 && FD_ISSET (ctx->log_fd, &read_fdset))
+          if (nfds && ctx->log_fd != -1 && FD_ISSET (ctx->log_fd, &fdset))
             {
               if (read_log_data (ctx))
-                any_action = 1;
+                {
+                  SAFE_CLOSE (ctx->log_fd);
+                  any_action = 1;
+                }
             }
 
           /* Check whether the process is still running.  */
@@ -468,7 +461,7 @@ ldap_wrapper_wait_connections ()
   shutting_down = 1;
   /* FIXME: This is a busy wait.  */
   while (wrapper_list)
-    npth_yield ();
+    npth_usleep (200);
 }
 
 
@@ -552,8 +545,8 @@ reader_callback (void *cb_value, char *buffer, size_t count,  size_t *nread)
   if (!buffer && !count && !nread)
     return -1; /* Rewind is not supported. */
 
-  /* If we ever encountered a read error don't allow to continue and
-     possible overwrite the last error cause.  Bail out also if the
+  /* If we ever encountered a read error, don't continue (we don't want to
+     possibly overwrite the last error cause).  Bail out also if the
      file descriptor has been closed. */
   if (ctx->fd_error || ctx->fd == -1)
     {
@@ -630,7 +623,7 @@ reader_callback (void *cb_value, char *buffer, size_t count,  size_t *nread)
   return 0;
 }
 
-/* Fork and exec the LDAP wrapper and returns a new libksba reader
+/* Fork and exec the LDAP wrapper and return a new libksba reader
    object at READER.  ARGV is a NULL terminated list of arguments for
    the wrapper.  The function returns 0 on success or an error code.
 
@@ -661,8 +654,9 @@ ldap_wrapper (ctrl_t ctrl, ksba_reader_t *reader, const char *argv[])
      only viable solutions are either to have another thread
      responsible for logging the messages or to add an option to the
      wrapper module to do the logging on its own.  Given that we anyway
-     need a way to rip the child process and this is best done using a
-     general ripping thread, that thread can do the logging too. */
+     need a way to reap the child process and this is best done using a
+     general reaping thread, that thread can do the logging too. */
+  ldap_wrapper_launch_thread ();
 
   *reader = NULL;
 
@@ -702,10 +696,10 @@ ldap_wrapper (ctrl_t ctrl, ksba_reader_t *reader, const char *argv[])
       return err;
     }
 
-  err = gnupg_create_inbound_pipe (outpipe);
+  err = gnupg_create_inbound_pipe (outpipe, NULL, 0);
   if (!err)
     {
-      err = gnupg_create_inbound_pipe (errpipe);
+      err = gnupg_create_inbound_pipe (errpipe, NULL, 0);
       if (err)
         {
           close (outpipe[0]);