diff --git a/pcsc-relay/configure.ac b/pcsc-relay/configure.ac
index 1308899..49c386d 100644
--- a/pcsc-relay/configure.ac
+++ b/pcsc-relay/configure.ac
@@ -5,8 +5,20 @@ AC_PREREQ([2.65])
AC_INIT([PC/SC Relay], [0.4], [http://sourceforge.net/projects/vsmartcard/support], [pcsc-relay], [http://vsmartcard.sourceforge.net/pcsc-relay/README.html])
AC_CONFIG_SRCDIR([src/pcsc-relay.c])
AC_CONFIG_HEADERS([config.h])
+AC_CONFIG_MACRO_DIR([m4])
AM_INIT_AUTOMAKE
+dnl Check for windows build
+case "${host}" in
+ *-mingw*|*-winnt*)
+ WIN32="yes"
+ ;;
+ *-cygwin*)
+ WIN32="yes"
+ ;;
+esac
+AM_CONDITIONAL([WIN32], [test "${WIN32}" = "yes"])
+
# Checks for programs.
AC_PROG_CC
AM_PROG_CC_C_O
diff --git a/pcsc-relay/src/Makefile.am b/pcsc-relay/src/Makefile.am
index c749dbc..66dde64 100644
--- a/pcsc-relay/src/Makefile.am
+++ b/pcsc-relay/src/Makefile.am
@@ -32,6 +32,10 @@ pcsc_relay_SOURCES = pcsc-relay.c pcsc.c vpcd.c vpcd-driver.c opicc.c lnfc.c $(B
pcsc_relay_LDADD = $(PCSC_LIBS) $(LIBNFC_LIBS)
pcsc_relay_CFLAGS = $(PCSC_CFLAGS) $(LIBNFC_CFLAGS)
+if WIN32
+pcsc_relay_LDADD += -lws2_32
+endif
+
noinst_HEADERS = pcsc-relay.h vpcd.h
pcsc-relay.c: $(BUILT_SOURCES)
diff --git a/virtualsmartcard/src/vpcd/vpcd.c b/virtualsmartcard/src/vpcd/vpcd.c
index 376e6ee..c78dc06 100644
--- a/virtualsmartcard/src/vpcd/vpcd.c
+++ b/virtualsmartcard/src/vpcd/vpcd.c
@@ -17,15 +17,24 @@
* virtualsmartcard. If not, see .
*/
#include "vpcd.h"
+
+#ifdef _WIN32
+#include
+#include
+#define close(s) closesocket(s)
+typedef WORD uint16_t;
+#else
#include
-#include
#include
-#include
-#include
#include
#include
-#include
#include
+#endif
+
+#include
+#include
+#include
+#include
#define VPCD_CTRL_LEN 1
@@ -50,14 +59,15 @@ ssize_t sendall(int sock, const void *buffer, size_t size)
{
size_t sent = 0;
ssize_t r;
+ const unsigned char *p = buffer;
while (sent < size) {
- r = send(sock, buffer, size-sent, 0);
+ r = send(sock, (void *) p, size-sent, 0);
if (r < 0)
return r;
sent += r;
- buffer += r;
+ p += r;
}
return sent;
@@ -77,7 +87,7 @@ int opensock(unsigned short port)
if (sock < 0)
return -1;
- if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof yes) != 0)
+ if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *) &yes, sizeof yes) != 0)
return -1;
memset(&server_sockaddr, 0, sizeof server_sockaddr);
@@ -103,7 +113,14 @@ int waitforclient(int server, long secs, long usecs)
struct timeval tv;
FD_ZERO(&rfds);
+#if _WIN32
+ /* work around clumsy define of FD_SET in winsock2.h */
+#pragma warning(disable:4127)
+ FD_SET((SOCKET) server, &rfds);
+#pragma warning(default:4127)
+#else
FD_SET(server, &rfds);
+#endif
tv.tv_sec = secs;
tv.tv_usec = usecs;
@@ -124,7 +141,7 @@ ssize_t sendToVICC(size_t length, const unsigned char* buffer)
uint16_t size;
/* send size of message on 2 bytes */
- size = htons(length);
+ size = htons((uint16_t) length);
r = sendall(client_sock, (void *) &size, sizeof size);
if (r == sizeof size)
/* send message */
diff --git a/virtualsmartcard/src/vpcd/vpcd.h b/virtualsmartcard/src/vpcd/vpcd.h
index 690a9b2..b4b0bf5 100644
--- a/virtualsmartcard/src/vpcd/vpcd.h
+++ b/virtualsmartcard/src/vpcd/vpcd.h
@@ -19,7 +19,12 @@
#ifndef _VPCD_H_
#define _VPCD_H_
+#ifdef _WIN32
+#include
+typedef int ssize_t;
+#else
#include
+#endif
#ifdef __cplusplus
extern "C" {