1
0
mirror of git://git.gnupg.org/gnupg.git synced 2024-07-05 03:09:21 +02:00

npth_sigwait is not available.

Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
This commit is contained in:
NIIBE Yutaka 2020-03-16 13:55:40 +09:00
parent 20a5cc93b5
commit beb14b8026

View File

@ -2158,7 +2158,7 @@ cmd_list_device (assuan_context_t ctx, char *line)
int watch = 0; int watch = 0;
if (has_option (line, "--watch")) if (has_option (line, "--watch"))
watch = 0; watch = 1;
if ((err = open_card (ctrl))) if ((err = open_card (ctrl)))
return err; return err;
@ -2168,14 +2168,14 @@ cmd_list_device (assuan_context_t ctx, char *line)
ctrl->server_local->watching_status = 1; ctrl->server_local->watching_status = 1;
while (1) while (1)
{ {
sigset_t sigmask;
int sig; int sig;
/* FIXME: sigwait OK?, what about Windows? */ npth_unprotect ();
sigemptyset (&sigmask); sigwait (npth_sigev_sigmask (), &sig);
sigaddset (&sigmask, SIGCONT); npth_protect ();
npth_sigwait (&sigmask, &sig);
/**/ assuan_write_status (ctx, "signal", "");
if (ctrl->server_local->card_removed) if (ctrl->server_local->card_removed)
{ {
ctrl->server_local->watching_status = 0; ctrl->server_local->watching_status = 0;
@ -2733,79 +2733,81 @@ send_client_notifications (card_t card, int removal)
struct server_local_s *sl; struct server_local_s *sl;
for (sl=session_list; sl; sl = sl->next_session) for (sl=session_list; sl; sl = sl->next_session)
if (sl->ctrl_backlink && sl->ctrl_backlink->card_ctx == card) {
{ if (sl->watching_status)
pid_t pid; 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 #ifdef HAVE_W32_SYSTEM
HANDLE handle; HANDLE handle;
#else #else
int signo; int signo;
#endif #endif
if (removal) if (removal)
{ {
sl->ctrl_backlink->card_ctx = NULL; sl->ctrl_backlink->card_ctx = NULL;
sl->ctrl_backlink->current_apptype = APPTYPE_NONE; sl->ctrl_backlink->current_apptype = APPTYPE_NONE;
sl->card_removed = 1; sl->card_removed = 1;
card_unref_locked (card); card_unref_locked (card);
} }
if (sl->watching_status) if (!sl->event_signal || !sl->assuan_ctx)
assuan_write_status (sl->assuan_ctx, "FIXME: change", "something"); continue;
if (!sl->event_signal || !sl->assuan_ctx) pid = assuan_get_pid (sl->assuan_ctx);
continue;
pid = assuan_get_pid (sl->assuan_ctx);
#ifdef HAVE_W32_SYSTEM #ifdef HAVE_W32_SYSTEM
handle = sl->event_signal; handle = sl->event_signal;
for (kidx=0; kidx < killidx; kidx++) for (kidx=0; kidx < killidx; kidx++)
if (killed[kidx].pid == pid if (killed[kidx].pid == pid
&& killed[kidx].handle == handle) && killed[kidx].handle == handle)
break; break;
if (kidx < killidx) if (kidx < killidx)
log_info ("event %p (%p) already triggered for client %d\n", 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",
sl->event_signal, handle, (int)pid); sl->event_signal, handle, (int)pid);
if (!SetEvent (handle)) else
log_error ("SetEvent(%p) failed: %s\n", {
sl->event_signal, w32_strerror (-1)); log_info ("triggering event %p (%p) for client %d\n",
if (killidx < DIM (killed)) sl->event_signal, handle, (int)pid);
{ if (!SetEvent (handle))
killed[killidx].pid = pid; log_error ("SetEvent(%p) failed: %s\n",
killed[killidx].handle = handle; sl->event_signal, w32_strerror (-1));
killidx++; if (killidx < DIM (killed))
} {
} killed[killidx].pid = pid;
killed[killidx].handle = handle;
killidx++;
}
}
#else /*!HAVE_W32_SYSTEM*/ #else /*!HAVE_W32_SYSTEM*/
signo = sl->event_signal; signo = sl->event_signal;
if (pid != (pid_t)(-1) && pid && signo > 0) if (pid != (pid_t)(-1) && pid && signo > 0)
{ {
for (kidx=0; kidx < killidx; kidx++) for (kidx=0; kidx < killidx; kidx++)
if (killed[kidx].pid == pid if (killed[kidx].pid == pid
&& killed[kidx].signo == signo) && killed[kidx].signo == signo)
break; break;
if (kidx < killidx) if (kidx < killidx)
log_info ("signal %d already sent to client %d\n", log_info ("signal %d already sent to client %d\n",
signo, (int)pid);
else
{
log_info ("sending signal %d to client %d\n",
signo, (int)pid); signo, (int)pid);
kill (pid, signo); else
if (killidx < DIM (killed)) {
{ log_info ("sending signal %d to client %d\n",
killed[killidx].pid = pid; signo, (int)pid);
killed[killidx].signo = signo; kill (pid, signo);
killidx++; if (killidx < DIM (killed))
} {
} killed[killidx].pid = pid;
} killed[killidx].signo = signo;
killidx++;
}
}
}
#endif /*!HAVE_W32_SYSTEM*/ #endif /*!HAVE_W32_SYSTEM*/
} }
}
} }