chiark / gitweb /
agent: Allow threads to interrupt main select loop with SIGCONT.
[gnupg2.git] / agent / gpg-agent.c
index 82c8ae0621a443e604cb785711aaa16925f9e6a4..04a775c9be4d04cb1b99114ffb7c8c395d1008dc 100644 (file)
@@ -382,6 +382,9 @@ static char *current_logfile;
    watched. */
 static pid_t parent_pid = (pid_t)(-1);
 
+/* Record the pid of the main thread, for easier signalling */
+static pid_t main_thread_pid = (pid_t)(-1);
+
 /* Number of active connections.  */
 static int active_connections;
 
@@ -2020,7 +2023,7 @@ get_agent_scd_notify_event (void)
                                  GetCurrentProcess(), &h2,
                                  EVENT_MODIFY_STATE|SYNCHRONIZE, TRUE, 0))
         {
-          log_error ("setting syncronize for scd notify event failed: %s\n",
+          log_error ("setting synchronize for scd notify event failed: %s\n",
                      w32_strerror (-1) );
           CloseHandle (h);
         }
@@ -2346,6 +2349,10 @@ handle_signal (int signo)
       agent_sigusr2_action ();
       break;
 
+      /* nothing to do here, just take an extra cycle on the select loop */
+    case SIGCONT:
+      break;
+
     case SIGTERM:
       if (!shutdown_pending)
         log_info ("SIGTERM received - shutting down ...\n");
@@ -2684,6 +2691,13 @@ start_connection_thread_ssh (void *arg)
 }
 
 
+void interrupt_main_thread_loop (void)
+{
+#ifndef HAVE_W32_SYSTEM
+  kill (main_thread_pid, SIGCONT);
+#endif
+}
+
 /* helper function for readability: test whether a given struct
    timespec is set to all-zeros */
 static inline int
@@ -2752,8 +2766,10 @@ handle_connections (gnupg_fd_t listen_fd,
   npth_sigev_add (SIGUSR1);
   npth_sigev_add (SIGUSR2);
   npth_sigev_add (SIGINT);
+  npth_sigev_add (SIGCONT);
   npth_sigev_add (SIGTERM);
   npth_sigev_fini ();
+  main_thread_pid = getpid ();
 #else
 # ifdef HAVE_W32CE_SYSTEM
   /* Use a dummy event. */
@@ -2765,6 +2781,7 @@ handle_connections (gnupg_fd_t listen_fd,
 # endif
 #endif
 
+
   if (disable_check_own_socket)
     my_inotify_fd = -1;
   else if ((err = gnupg_inotify_watch_socket (&my_inotify_fd, socket_name)))