made vpcd.c/vpcd.h windows-compatible

This commit is contained in:
Frank Morgner
2013-05-19 04:08:44 +02:00
parent fd6fdd8b01
commit bae3f07045
4 changed files with 46 additions and 8 deletions

View File

@@ -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

View File

@@ -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)

View File

@@ -17,15 +17,24 @@
* virtualsmartcard. If not, see <http://www.gnu.org/licenses/>.
*/
#include "vpcd.h"
#ifdef _WIN32
#include <winsock2.h>
#include <ws2tcpip.h>
#define close(s) closesocket(s)
typedef WORD uint16_t;
#else
#include <arpa/inet.h>
#include <errno.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#endif
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#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 */

View File

@@ -19,7 +19,12 @@
#ifndef _VPCD_H_
#define _VPCD_H_
#ifdef _WIN32
#include <stddef.h>
typedef int ssize_t;
#else
#include <unistd.h>
#endif
#ifdef __cplusplus
extern "C" {