aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNIIBE Yutaka <[email protected]>2020-03-16 04:55:40 +0000
committerNIIBE Yutaka <[email protected]>2020-04-02 05:11:52 +0000
commitbeb14b802614a95563234e3367b5696e3e43a04d (patch)
tree5d8dfb877b352f2f9fcd36e8924a48c7904573bc
parentrough sketch. (diff)
downloadgnupg-beb14b802614a95563234e3367b5696e3e43a04d.tar.gz
gnupg-beb14b802614a95563234e3367b5696e3e43a04d.zip
npth_sigwait is not available.
Signed-off-by: NIIBE Yutaka <[email protected]>
-rw-r--r--scd/command.c142
1 files changed, 72 insertions, 70 deletions
diff --git a/scd/command.c b/scd/command.c
index d38182cce..1c88b384d 100644
--- a/scd/command.c
+++ b/scd/command.c
@@ -2158,7 +2158,7 @@ cmd_list_device (assuan_context_t ctx, char *line)
int watch = 0;
if (has_option (line, "--watch"))
- watch = 0;
+ watch = 1;
if ((err = open_card (ctrl)))
return err;
@@ -2168,14 +2168,14 @@ cmd_list_device (assuan_context_t ctx, char *line)
ctrl->server_local->watching_status = 1;
while (1)
{
- sigset_t sigmask;
int sig;
- /* FIXME: sigwait OK?, what about Windows? */
- sigemptyset (&sigmask);
- sigaddset (&sigmask, SIGCONT);
- npth_sigwait (&sigmask, &sig);
- /**/
+ npth_unprotect ();
+ sigwait (npth_sigev_sigmask (), &sig);
+ npth_protect ();
+
+ assuan_write_status (ctx, "signal", "");
+
if (ctrl->server_local->card_removed)
{
ctrl->server_local->watching_status = 0;
@@ -2733,79 +2733,81 @@ send_client_notifications (card_t card, int removal)
struct server_local_s *sl;
for (sl=session_list; sl; sl = sl->next_session)
- if (sl->ctrl_backlink && sl->ctrl_backlink->card_ctx == card)
- {
- pid_t pid;
+ {
+ if (sl->watching_status)
+ assuan_write_status (sl->assuan_ctx, "FIXME: change", "something");
+
+ if (sl->ctrl_backlink && sl->ctrl_backlink->card_ctx == card)
+ {
+ pid_t pid;
#ifdef HAVE_W32_SYSTEM
- HANDLE handle;
+ HANDLE handle;
#else
- int signo;
+ int signo;
#endif
- if (removal)
- {
- sl->ctrl_backlink->card_ctx = NULL;
- sl->ctrl_backlink->current_apptype = APPTYPE_NONE;
- sl->card_removed = 1;
- card_unref_locked (card);
- }
-
- if (sl->watching_status)
- assuan_write_status (sl->assuan_ctx, "FIXME: change", "something");
+ if (removal)
+ {
+ sl->ctrl_backlink->card_ctx = NULL;
+ sl->ctrl_backlink->current_apptype = APPTYPE_NONE;
+ sl->card_removed = 1;
+ card_unref_locked (card);
+ }
- if (!sl->event_signal || !sl->assuan_ctx)
- continue;
+ if (!sl->event_signal || !sl->assuan_ctx)
+ continue;
- pid = assuan_get_pid (sl->assuan_ctx);
+ pid = assuan_get_pid (sl->assuan_ctx);
#ifdef HAVE_W32_SYSTEM
- handle = sl->event_signal;
- for (kidx=0; kidx < killidx; kidx++)
- if (killed[kidx].pid == pid
- && killed[kidx].handle == handle)
- break;
- if (kidx < killidx)
- log_info ("event %p (%p) already triggered for client %d\n",
- sl->event_signal, handle, (int)pid);
- else
- {
- log_info ("triggering event %p (%p) for client %d\n",
+ handle = sl->event_signal;
+ for (kidx=0; kidx < killidx; kidx++)
+ if (killed[kidx].pid == pid
+ && killed[kidx].handle == handle)
+ break;
+ if (kidx < killidx)
+ log_info ("event %p (%p) already triggered for client %d\n",
sl->event_signal, handle, (int)pid);
- if (!SetEvent (handle))
- log_error ("SetEvent(%p) failed: %s\n",
- sl->event_signal, w32_strerror (-1));
- if (killidx < DIM (killed))
- {
- killed[killidx].pid = pid;
- killed[killidx].handle = handle;
- killidx++;
- }
- }
+ else
+ {
+ log_info ("triggering event %p (%p) for client %d\n",
+ sl->event_signal, handle, (int)pid);
+ if (!SetEvent (handle))
+ log_error ("SetEvent(%p) failed: %s\n",
+ sl->event_signal, w32_strerror (-1));
+ if (killidx < DIM (killed))
+ {
+ killed[killidx].pid = pid;
+ killed[killidx].handle = handle;
+ killidx++;
+ }
+ }
#else /*!HAVE_W32_SYSTEM*/
- signo = sl->event_signal;
-
- if (pid != (pid_t)(-1) && pid && signo > 0)
- {
- for (kidx=0; kidx < killidx; kidx++)
- if (killed[kidx].pid == pid
- && killed[kidx].signo == signo)
- break;
- if (kidx < killidx)
- log_info ("signal %d already sent to client %d\n",
- signo, (int)pid);
- else
- {
- log_info ("sending signal %d to client %d\n",
+ signo = sl->event_signal;
+
+ if (pid != (pid_t)(-1) && pid && signo > 0)
+ {
+ for (kidx=0; kidx < killidx; kidx++)
+ if (killed[kidx].pid == pid
+ && killed[kidx].signo == signo)
+ break;
+ if (kidx < killidx)
+ log_info ("signal %d already sent to client %d\n",
signo, (int)pid);
- kill (pid, signo);
- if (killidx < DIM (killed))
- {
- killed[killidx].pid = pid;
- killed[killidx].signo = signo;
- killidx++;
- }
- }
- }
+ else
+ {
+ log_info ("sending signal %d to client %d\n",
+ signo, (int)pid);
+ kill (pid, signo);
+ if (killidx < DIM (killed))
+ {
+ killed[killidx].pid = pid;
+ killed[killidx].signo = signo;
+ killidx++;
+ }
+ }
+ }
#endif /*!HAVE_W32_SYSTEM*/
- }
+ }
+ }
}