[git] GnuPG - branch, master, updated. gnupg-2.1.19-13-gf9acc7d
by NIIBE Yutaka
cvs at cvs.gnupg.org
Fri Mar 3 12:40:18 CET 2017
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "The GNU Privacy Guard".
The branch, master has been updated
via f9acc7d18bb90f47dafe7e32ae92f567756d6b12 (commit)
from 5f6f3f5cae8a95ed469129f9677782c17951dab3 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit f9acc7d18bb90f47dafe7e32ae92f567756d6b12
Author: NIIBE Yutaka <gniibe at fsij.org>
Date: Fri Mar 3 20:30:56 2017 +0900
scd: Fix scd_kick_the_loop.
* scd/scdaemon.c (notify_fd): Remove.
(the_event) [W32]: New.
(main_thread_pid) [!W32]: New.
(handle_signal): Handle SIGCONT.
(scd_kick_the_loop): Use signal on UNIX and event on Windows.
(handle_connections): Likewise.
--
Code with CreateEvent is copied from gpg-agent.c.
Code for signal is copied from dkg's gpg-agent-idling in Debian.
GnuPG-bug-id: 2982
Signed-off-by: NIIBE Yutaka <gniibe at fsij.org>
diff --git a/scd/scdaemon.c b/scd/scdaemon.c
index f7e9f83..4b63c9b 100644
--- a/scd/scdaemon.c
+++ b/scd/scdaemon.c
@@ -224,8 +224,12 @@ static char *redir_socket_name;
POSIX systems). */
static assuan_sock_nonce_t socket_nonce;
-/* FD to notify update of usb devices. */
-static int notify_fd;
+#ifdef HAVE_W32_SYSTEM
+static HANDLE the_event;
+#else
+/* PID to notify update of usb devices. */
+static pid_t main_thread_pid;
+#endif
static char *create_socket_name (char *standard_name);
static gnupg_fd_t create_server_socket (const char *name,
@@ -996,6 +1000,10 @@ handle_signal (int signo)
log_info ("SIGUSR2 received - no action defined\n");
break;
+ case SIGCONT:
+ /* Nothing. */
+ break;
+
case SIGTERM:
if (!shutdown_pending)
log_info ("SIGTERM received - shutting down ...\n");
@@ -1185,8 +1193,17 @@ scd_kick_the_loop (void)
int ret;
/* Kick the select loop. */
- ret = write (notify_fd, "", 1);
- (void)ret;
+#ifdef HAVE_W32_SYSTEM
+ ret = SetEvent (the_event);
+ if (ret == 0)
+ log_error ("SetEvent for scd_kick_the_loop failed: %s\n",
+ w32_strerror (-1));
+#else
+ ret = kill (main_thread_pid, SIGCONT);
+ if (ret < 0)
+ log_error ("SetEvent for scd_kick_the_loop failed: %s\n",
+ gpg_strerror (gpg_error_from_syserror ()));
+#endif
}
/* Connection handler loop. Wait for connection requests and spawn a
@@ -1206,18 +1223,12 @@ handle_connections (int listen_fd)
struct timespec timeout;
struct timespec *t;
int saved_errno;
-#ifndef HAVE_W32_SYSTEM
+#ifdef HAVE_W32_SYSTEM
+ HANDLE events[2];
+ unsigned int events_set;
+#else
int signo;
#endif
- int pipe_fd[2];
-
- ret = gnupg_create_pipe (pipe_fd);
- if (ret)
- {
- log_error ("pipe creation failed: %s\n", gpg_strerror (ret));
- return;
- }
- notify_fd = pipe_fd[1];
ret = npth_attr_init(&tattr);
if (ret)
@@ -1228,14 +1239,40 @@ handle_connections (int listen_fd)
npth_attr_setdetachstate (&tattr, NPTH_CREATE_DETACHED);
-#ifndef HAVE_W32_SYSTEM
+#ifdef HAVE_W32_SYSTEM
+ {
+ HANDLE h, h2;
+ SECURITY_ATTRIBUTES sa = { sizeof (SECURITY_ATTRIBUTES), NULL, TRUE};
+
+ events[0] = the_event = INVALID_HANDLE_VALUE;
+ events[1] = INVALID_HANDLE_VALUE;
+ h = CreateEvent (&sa, TRUE, FALSE, NULL);
+ if (!h)
+ log_error ("can't create scd event: %s\n", w32_strerror (-1) );
+ else if (!DuplicateHandle (GetCurrentProcess(), h,
+ GetCurrentProcess(), &h2,
+ EVENT_MODIFY_STATE|SYNCHRONIZE, TRUE, 0))
+ {
+ log_error ("setting synchronize for scd_kick_the_loop failed: %s\n",
+ w32_strerror (-1) );
+ CloseHandle (h);
+ }
+ else
+ {
+ CloseHandle (h);
+ events[0] = the_event = h2;
+ }
+ }
+#else
npth_sigev_init ();
npth_sigev_add (SIGHUP);
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 ();
#endif
FD_ZERO (&fdset);
@@ -1246,10 +1283,6 @@ handle_connections (int listen_fd)
nfd = listen_fd;
}
- FD_SET (pipe_fd[0], &fdset);
- if (nfd < pipe_fd[0])
- nfd = pipe_fd[0];
-
for (;;)
{
int periodical_check;
@@ -1264,8 +1297,6 @@ handle_connections (int listen_fd)
file descriptors to wait for, so that the select will be
used to just wait on a signal or timeout event. */
FD_ZERO (&fdset);
- FD_SET (pipe_fd[0], &fdset);
- nfd = pipe_fd[0];
listen_fd = -1;
}
@@ -1291,8 +1322,11 @@ handle_connections (int listen_fd)
while (npth_sigev_get_pending(&signo))
handle_signal (signo);
#else
- ret = npth_eselect (nfd+1, &read_fdset, NULL, NULL, t, NULL, NULL);
+ ret = npth_eselect (nfd+1, &read_fdset, NULL, NULL, t,
+ events, &events_set);
saved_errno = errno;
+ if (events_set & 1)
+ continue;
#endif
if (ret == -1 && saved_errno != EINTR)
@@ -1307,13 +1341,6 @@ handle_connections (int listen_fd)
/* Timeout. Will be handled when calculating the next timeout. */
continue;
- if (FD_ISSET (pipe_fd[0], &read_fdset))
- {
- char buf[256];
-
- ret = read (pipe_fd[0], buf, sizeof buf);
- }
-
if (listen_fd != -1 && FD_ISSET (listen_fd, &read_fdset))
{
ctrl_t ctrl;
@@ -1351,8 +1378,6 @@ handle_connections (int listen_fd)
}
}
- close (pipe_fd[0]);
- close (pipe_fd[1]);
cleanup ();
log_info (_("%s %s stopped\n"), strusage(11), strusage(13));
npth_attr_destroy (&tattr);
-----------------------------------------------------------------------
Summary of changes:
scd/scdaemon.c | 87 +++++++++++++++++++++++++++++++++++++---------------------
1 file changed, 56 insertions(+), 31 deletions(-)
hooks/post-receive
--
The GNU Privacy Guard
http://git.gnupg.org
More information about the Gnupg-commits
mailing list