aboutsummaryrefslogtreecommitdiffstats
path: root/scd/command.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2008-10-14 18:18:21 +0000
committerWerner Koch <[email protected]>2008-10-14 18:18:21 +0000
commitd0ca9530146bea3764bf87f8a01e897c2e88448c (patch)
tree6e37e741dccd468bcd9ee8e1018a9dbf0b5aed1d /scd/command.c
parentAdd --delete-keys as alias for --delete-key. (diff)
downloadgnupg-d0ca9530146bea3764bf87f8a01e897c2e88448c.tar.gz
gnupg-d0ca9530146bea3764bf87f8a01e897c2e88448c.zip
SCD changes for PC/SC under W32.
Diffstat (limited to 'scd/command.c')
-rw-r--r--scd/command.c43
1 files changed, 38 insertions, 5 deletions
diff --git a/scd/command.c b/scd/command.c
index 696fa67ee..aabd93c25 100644
--- a/scd/command.c
+++ b/scd/command.c
@@ -102,8 +102,12 @@ struct server_local_s
/* The Assuan context used by this session/server. */
assuan_context_t assuan_ctx;
- int event_signal; /* Or 0 if not used. */
-
+#ifdef HAVE_W32_SYSTEM
+ unsigned long event_signal; /* Or 0 if not used. */
+#else
+ int event_signal; /* Or 0 if not used. */
+#endif
+
/* True if the card has been removed and a reset is required to
continue operation. */
int card_removed;
@@ -165,6 +169,7 @@ update_card_removed (int slot, int value)
{
sl->card_removed = value;
}
+ /* Let the card application layer know about the removal. */
if (value)
application_notify_card_removed (slot);
}
@@ -319,10 +324,16 @@ option_handler (assuan_context_t ctx, const char *key, const char *value)
if (!strcmp (key, "event-signal"))
{
/* A value of 0 is allowed to reset the event signal. */
+#ifdef HAVE_W32_SYSTEM
+ if (!*value)
+ return gpg_error (GPG_ERR_ASS_PARAMETER);
+ ctrl->server_local->event_signal = strtoul (value, NULL, 16);
+#else
int i = *value? atoi (value) : -1;
if (i < 0)
return gpg_error (GPG_ERR_ASS_PARAMETER);
ctrl->server_local->event_signal = i;
+#endif
}
return 0;
@@ -389,7 +400,15 @@ open_card (ctrl_t ctrl, const char *apptype)
if (slot == -1)
err = gpg_error (GPG_ERR_CARD);
else
- err = select_application (ctrl, slot, apptype, &ctrl->app_ctx);
+ {
+ /* Fixme: We should move the apdu_connect call to
+ select_application. */
+ int sw = apdu_connect (slot);
+ if (sw && sw != SW_HOST_ALREADY_CONNECTED)
+ err = gpg_error (GPG_ERR_CARD);
+ else
+ err = select_application (ctrl, slot, apptype, &ctrl->app_ctx);
+ }
TEST_CARD_REMOVAL (ctrl, err);
return err;
@@ -1774,7 +1793,7 @@ scd_command_handler (ctrl_t ctrl, int fd)
}
else
{
- rc = assuan_init_socket_server_ext (&ctx, fd, 2);
+ rc = assuan_init_socket_server_ext (&ctx, INT2FD(fd), 2);
}
if (rc)
{
@@ -1911,6 +1930,11 @@ update_reader_status_file (void)
int idx;
unsigned int status, changed;
+ /* Make sure that the reader has been opened. Like get_reader_slot,
+ this part of the code assumes that there is only one reader. */
+ if (!slot_table[0].valid)
+ (void)get_reader_slot ();
+
/* Note, that we only try to get the status, because it does not
make sense to wait here for a operation to complete. If we are
busy working with a card, delays in the status file update should
@@ -2007,11 +2031,20 @@ update_reader_status_file (void)
if (sl->event_signal && sl->assuan_ctx)
{
pid_t pid = assuan_get_pid (sl->assuan_ctx);
+
+#ifdef HAVE_W32_SYSTEM
+ HANDLE handle = (void *)sl->event_signal;
+
+ log_info ("client pid is %d, triggering event %lx (%p)\n",
+ pid, sl->event_signal, handle);
+ if (!SetEvent (handle))
+ log_error ("SetEvent(%lx) failed: %s\n",
+ sl->event_signal, w32_strerror (-1));
+#else
int signo = sl->event_signal;
log_info ("client pid is %d, sending signal %d\n",
pid, signo);
-#ifndef HAVE_W32_SYSTEM
if (pid != (pid_t)(-1) && pid && signo > 0)
kill (pid, signo);
#endif