aboutsummaryrefslogtreecommitdiffstats
path: root/scd
diff options
context:
space:
mode:
Diffstat (limited to 'scd')
-rw-r--r--scd/ChangeLog11
-rw-r--r--scd/Makefile.am14
-rw-r--r--scd/apdu.c7
-rw-r--r--scd/command.c5
-rw-r--r--scd/scdaemon.c40
5 files changed, 67 insertions, 10 deletions
diff --git a/scd/ChangeLog b/scd/ChangeLog
index 628055e80..fe3b3f6c4 100644
--- a/scd/ChangeLog
+++ b/scd/ChangeLog
@@ -1,3 +1,14 @@
+2004-12-15 Werner Koch <[email protected]>
+
+ * scdaemon.c [W32]: Various hacks to make it run under W32.
+
+ * command.c (scd_update_reader_status_file) [W32]: Don't use kill.
+
+ * apdu.c [W32]: Disable use of pcsc_wrapper.
+
+ * Makefile.am (scdaemon_LDADD): Reorder libs.
+ (sc_copykeys_LDADD): Add libassuan because it is needed for W32.
+
2004-12-06 Werner Koch <[email protected]>
* Makefile.am (pkglib_PROGRAMS): Build only for W32.
diff --git a/scd/Makefile.am b/scd/Makefile.am
index 43bee4889..fba006c5a 100644
--- a/scd/Makefile.am
+++ b/scd/Makefile.am
@@ -19,7 +19,7 @@
## Process this file with automake to produce Makefile.in
bin_PROGRAMS = scdaemon sc-copykeys
-if HAVE_W32_SYSTEM
+if ! HAVE_W32_SYSTEM
pkglib_PROGRAMS = pcsc-wrapper
endif
@@ -53,10 +53,8 @@ scdaemon_SOURCES = \
scdaemon_LDADD = ../jnlib/libjnlib.a ../common/libcommon.a \
- $(LIBGCRYPT_LIBS) $(pth_libs) \
- $(KSBA_LIBS) $(LIBASSUAN_LIBS) \
- $(LIBUSB_LIBS) $(OPENSC_LIBS) -lgpg-error @LIBINTL@ \
- @DL_LIBS@
+ $(LIBGCRYPT_LIBS) $(KSBA_LIBS) $(pth_libs) $(LIBASSUAN_LIBS) \
+ $(LIBUSB_LIBS) $(OPENSC_LIBS) -lgpg-error $(LIBINTL) $(DL_LIBS)
sc_copykeys_SOURCES = \
sc-copykeys.c scdaemon.h \
@@ -70,10 +68,10 @@ sc_copykeys_SOURCES = \
sc_copykeys_LDADD = \
../jnlib/libjnlib.a ../common/libcommon.a \
../common/libsimple-pwquery.a \
- $(LIBGCRYPT_LIBS) $(pth_libs) \
- $(KSBA_LIBS) $(LIBUSB_LIBS) $(OPENSC_LIBS) \
+ $(LIBGCRYPT_LIBS) $(pth_libs) $(KSBA_LIBS) $(LIBASSUAN_LIBS) \
+ $(LIBUSB_LIBS) $(OPENSC_LIBS) \
-lgpg-error @LIBINTL@ @DL_LIBS@
pcsc_wrapper_SOURCES = pcsc-wrapper.c
-pcsc_wrapper_LDADD = @DL_LIBS@
+pcsc_wrapper_LDADD = $(DL_LIBS)
pcsc_wrapper_CFLAGS =
diff --git a/scd/apdu.c b/scd/apdu.c
index f4b32d141..9120616de 100644
--- a/scd/apdu.c
+++ b/scd/apdu.c
@@ -65,11 +65,16 @@
#include "dynload.h"
#include "ccid-driver.h"
+
+/* To to conflicting use of threading libraries we usually can't link
+ against libpcsclite. Instead we use a wrapper program. */
#ifdef USE_GNU_PTH
+#ifndef HAVE_W32_SYSTEM
#define NEED_PCSC_WRAPPER 1
#endif
+#endif
-
+
#define MAX_READER 4 /* Number of readers we support concurrently. */
diff --git a/scd/command.c b/scd/command.c
index 6fa100ff9..b99fffc09 100644
--- a/scd/command.c
+++ b/scd/command.c
@@ -1260,8 +1260,13 @@ scd_update_reader_status_file (void)
int signo = primary_connection->server_local->event_signal;
log_info ("client pid is %d, sending signal %d\n", pid, signo);
+
+#ifdef HAVE_W32_SYSTEM
+#warning Need to implement a notification service
+#else
if (pid != (pid_t)(-1) && pid && signo > 0)
kill (pid, signo);
+#endif
}
}
}
diff --git a/scd/scdaemon.c b/scd/scdaemon.c
index b54a63816..135f0973a 100644
--- a/scd/scdaemon.c
+++ b/scd/scdaemon.c
@@ -29,8 +29,10 @@
#include <assert.h>
#include <time.h>
#include <fcntl.h>
+#ifndef HAVE_W32_SYSTEM
#include <sys/socket.h>
#include <sys/un.h>
+#endif /*HAVE_W32_SYSTEM*/
#include <unistd.h>
#include <signal.h>
#ifdef USE_GNU_PTH
@@ -47,6 +49,9 @@
#include "i18n.h"
#include "sysutils.h"
#include "app-common.h"
+#ifdef HAVE_W32_SYSTEM
+#include "../jnlib/w32-afunix.h"
+#endif
enum cmd_and_opt_values
@@ -131,7 +136,12 @@ static ARGPARSE_OPTS opts[] = {
};
+/* The card dirver we use by default for PC/SC. */
+#ifdef HAVE_W32_SYSTEM
+#define DEFAULT_PCSC_DRIVER "winscard.dll"
+#else
#define DEFAULT_PCSC_DRIVER "libpcsclite.so"
+#endif
static volatile int caught_fatal_sig = 0;
@@ -148,8 +158,10 @@ static char socket_name[128];
#ifndef HAVE_OPENSC
#ifdef USE_GNU_PTH
+#ifndef HAVE_W32_SYSTEM
/* Pth wrapper function definitions. */
GCRY_THREAD_OPTION_PTH_IMPL;
+#endif
static void *ticker_thread (void *arg);
#endif /*USE_GNU_PTH*/
@@ -341,12 +353,16 @@ main (int argc, char **argv )
Note that this will also do the pth_init. */
#ifndef HAVE_OPENSC
#ifdef USE_GNU_PTH
+# ifdef HAVE_W32_SYSTEM
+ pth_init ();
+# else /*!HAVE_W32_SYSTEM*/
err = gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_pth);
if (err)
{
log_fatal ("can't register GNU Pth with Libgcrypt: %s\n",
gpg_strerror (err));
}
+# endif /*!HAVE_W32_SYSTEM*/
#endif /*USE_GNU_PTH*/
#endif /*!HAVE_OPENSC*/
@@ -649,12 +665,15 @@ main (int argc, char **argv )
if (!p)
BUG ();
*p = 0;;
+
+#ifndef HAVE_W32_SYSTEM
if (!mkdtemp(socket_name))
{
log_error ("can't create directory `%s': %s\n",
socket_name, strerror(errno) );
exit (1);
}
+#endif
*p = '/';
if (strchr (socket_name, ':') )
@@ -669,7 +688,11 @@ main (int argc, char **argv )
}
+#ifdef HAVE_W32_SYSTEM
+ fd = _w32_sock_new (AF_UNIX, SOCK_STREAM, 0);
+#else
fd = socket (AF_UNIX, SOCK_STREAM, 0);
+#endif
if (fd == -1)
{
log_error ("can't create socket: %s\n", strerror(errno) );
@@ -682,7 +705,13 @@ main (int argc, char **argv )
len = (offsetof (struct sockaddr_un, sun_path)
+ strlen(serv_addr.sun_path) + 1);
- if (bind (fd, (struct sockaddr*)&serv_addr, len) == -1)
+ if (
+#ifdef HAVE_W32_SYSTEM
+ _w32_sock_bind
+#else
+ bind
+#endif
+ (fd, (struct sockaddr*)&serv_addr, len) == -1)
{
log_error ("error binding socket to `%s': %s\n",
serv_addr.sun_path, strerror (errno) );
@@ -702,6 +731,7 @@ main (int argc, char **argv )
fflush (NULL);
+#ifndef HAVE_W32_SYSTEM
pid = fork ();
if (pid == (pid_t)-1)
{
@@ -800,6 +830,8 @@ main (int argc, char **argv )
exit (1);
}
+#endif /*!HAVE_W32_SYSTEM*/
+
scd_command_handler (fd);
close (fd);
@@ -846,6 +878,7 @@ handle_signal (int signo)
{
switch (signo)
{
+#ifndef HAVE_W32_SYSTEM
case SIGHUP:
log_info ("SIGHUP received - "
"re-reading configuration and resetting cards\n");
@@ -882,6 +915,7 @@ handle_signal (int signo)
cleanup ();
scd_exit (0);
break;
+#endif /*!HAVE_W32_SYSTEM*/
default:
log_info ("signal %d received - no action defined\n", signo);
@@ -901,6 +935,7 @@ ticker_thread (void *dummy_arg)
sigset_t sigs;
int signo;
+#ifndef HAVE_W32_SYSTEM /* fixme */
sigemptyset (&sigs );
sigaddset (&sigs, SIGHUP);
sigaddset (&sigs, SIGUSR1);
@@ -908,6 +943,9 @@ ticker_thread (void *dummy_arg)
sigaddset (&sigs, SIGINT);
sigaddset (&sigs, SIGTERM);
sigs_ev = pth_event (PTH_EVENT_SIGS, &sigs, &signo);
+#else
+ sigs_ev = NULL;
+#endif
for (;;)
{