diff --git a/agent/gpg-agent.c b/agent/gpg-agent.c index 72638a63d..ed4b17f99 100644 --- a/agent/gpg-agent.c +++ b/agent/gpg-agent.c @@ -1391,9 +1391,9 @@ get_agent_ssh_socket_name (void) void * get_agent_scd_notify_event (void) { - static HANDLE the_event; + static HANDLE the_event = INVALID_HANDLE_VALUE; - if (!the_event) + if (the_event == INVALID_HANDLE_VALUE) { HANDLE h, h2; SECURITY_ATTRIBUTES sa = { sizeof (SECURITY_ATTRIBUTES), NULL, TRUE}; @@ -1717,6 +1717,7 @@ agent_sigusr2_action (void) } +#ifndef HAVE_W32_SYSTEM /* The signal handler for this program. It is expected to be run in its own trhead and not in the context of a signal handler. */ static void @@ -1769,7 +1770,7 @@ handle_signal (int signo) log_info ("signal %d received - no action defined\n", signo); } } - +#endif /* Check the nonce on a new connection. This is a NOP unless we we are using our Unix domain socket emulation under Windows. */ @@ -1849,7 +1850,6 @@ static void handle_connections (gnupg_fd_t listen_fd, gnupg_fd_t listen_fd_ssh) { npth_attr_t tattr; - int signo; struct sockaddr_un paddr; socklen_t plen; fd_set fdset, read_fdset; @@ -1860,6 +1860,10 @@ handle_connections (gnupg_fd_t listen_fd, gnupg_fd_t listen_fd_ssh) struct timespec abstime; struct timespec curtime; struct timespec timeout; +#ifdef HAVE_W32_SYSTEM + HANDLE events[2]; + int events_set; +#endif ret = npth_attr_init(&tattr); /* FIXME: Check error. */ @@ -1879,9 +1883,8 @@ handle_connections (gnupg_fd_t listen_fd, gnupg_fd_t listen_fd_ssh) sigs = 0; ev = pth_event (PTH_EVENT_SIGS, &sigs, &signo); # else - sigs = 0; - ev = pth_event (PTH_EVENT_HANDLE, get_agent_scd_notify_event ()); - signo = 0; + events[0] = get_agent_scd_notify_event (); + events[1] = INVALID_HANDLE_VALUE; # endif #endif @@ -1929,16 +1932,19 @@ handle_connections (gnupg_fd_t listen_fd, gnupg_fd_t listen_fd_ssh) } npth_timersub (&abstime, &curtime, &timeout); +#ifndef HAVE_W32_SYSTEM ret = npth_pselect (nfd+1, &read_fdset, NULL, NULL, &timeout, npth_sigev_sigmask()); saved_errno = errno; -#ifndef HAVE_W32_SYSTEM while (npth_sigev_get_pending(&signo)) handle_signal (signo); -#endif +#else + events_set = 0; + ret = npth_eselect (nfd+1, &read_fdset, NULL, NULL, &timeout, events, &events_set); + saved_errno = errno; -#if defined(HAVE_W32_SYSTEM) && defined(PTH_EVENT_HANDLE) - if (pth_event_occurred (ev)) + /* This is valid even if npth_eselect returns an error. */ + if (events_set & 1) agent_sigusr2_action (); #endif @@ -2023,7 +2029,7 @@ handle_connections (gnupg_fd_t listen_fd, gnupg_fd_t listen_fd_ssh) } else { - pthread_t thread; + npth_t thread; agent_init_default_ctrl (ctrl); ctrl->thread_startup.fd = fd; diff --git a/dirmngr/dirmngr.c b/dirmngr/dirmngr.c index 51cefd590..b0410afd0 100644 --- a/dirmngr/dirmngr.c +++ b/dirmngr/dirmngr.c @@ -1749,9 +1749,6 @@ handle_connections (assuan_fd_t listen_fd) npth_sigev_add (SIGINT); npth_sigev_add (SIGTERM); npth_sigev_fini (); -#else - /* Use a dummy event. */ - sigs = 0; #endif /* Setup the fdset. It has only one member. This is because we use @@ -1791,12 +1788,15 @@ handle_connections (assuan_fd_t listen_fd) } npth_timersub (&abstime, &curtime, &timeout); +#ifndef HAVE_W32_SYSTEM ret = npth_pselect (nfd+1, &read_fdset, NULL, NULL, &timeout, npth_sigev_sigmask()); saved_errno = errno; -#ifndef HAVE_W32_SYSTEM while (npth_sigev_get_pending(&signo)) handle_signal (signo); +#else + ret = npth_eselect (nfd+1, &read_fdset, NULL, NULL, &timeout, NULL, NULL); + saved_errno = errno; #endif if (ret == -1 && saved_errno != EINTR) diff --git a/g13/g13.c b/g13/g13.c index 34b91c166..b33ea61ed 100644 --- a/g13/g13.c +++ b/g13/g13.c @@ -854,8 +854,6 @@ idle_task (void *dummy_arg) npth_sigev_add (SIGINT); npth_sigev_add (SIGTERM); npth_sigev_fini (); -#else - sigs = 0; #endif npth_clock_gettime (&abstime); @@ -882,12 +880,15 @@ idle_task (void *dummy_arg) } npth_timersub (&abstime, &curtime, &timeout); +#ifndef HAVE_W32_SYSTEM ret = npth_pselect (0, NULL, NULL, NULL, &timeout, npth_sigev_sigmask()); saved_errno = errno; -#ifndef HAVE_W32_SYSTEM while (npth_sigev_get_pending(&signo)) handle_signal (signo); +#else + ret = npth_eselect (0, NULL, NULL, NULL, &timeout, NULL, NULL); + saved_errno = errno; #endif if (ret == -1 && saved_errno != EINTR) @@ -920,6 +921,7 @@ start_idle_task (void) sigset_t sigs; /* The set of signals we want to catch. */ int err; +#ifndef HAVE_W32_SYSTEM /* These signals should always go to the idle task, so they need to be blocked everywhere else. We assume start_idle_task is called from the main thread before any other threads are created. */ @@ -930,6 +932,7 @@ start_idle_task (void) sigaddset (&sigs, SIGINT); sigaddset (&sigs, SIGTERM); npth_sigmask (SIG_BLOCK, &sigs, NULL); +#endif npth_attr_init (&tattr); npth_attr_setdetachstate (&tattr, NPTH_CREATE_JOINABLE); diff --git a/scd/scdaemon.c b/scd/scdaemon.c index ad5f691bb..e8073b7ee 100644 --- a/scd/scdaemon.c +++ b/scd/scdaemon.c @@ -1185,9 +1185,6 @@ handle_connections (int listen_fd) npth_sigev_add (SIGINT); npth_sigev_add (SIGTERM); npth_sigev_fini (); -#else - sigs = 0; - ev = pth_event (PTH_EVENT_SIGS, &sigs, &signo); #endif FD_ZERO (&fdset); @@ -1234,17 +1231,20 @@ handle_connections (int listen_fd) thus a simple assignment is fine to copy the entire set. */ read_fdset = fdset; +#ifndef HAVE_W32_SYSTEM ret = npth_pselect (nfd+1, &read_fdset, NULL, NULL, &timeout, npth_sigev_sigmask()); saved_errno = errno; -#ifndef HAVE_W32_SYSTEM while (npth_sigev_get_pending(&signo)) handle_signal (signo); +#else + ret = npth_eselect (nfd+1, &read_fdset, NULL, NULL, &timeout, NULL, NULL); + saved_errno = errno; #endif if (ret == -1 && saved_errno != EINTR) { - log_error (_("pth_pselect failed: %s - waiting 1s\n"), + log_error (_("npth_pselect failed: %s - waiting 1s\n"), strerror (saved_errno)); npth_sleep (1); continue;