From f5bc174ba37501c0679cfd0745611761be9dd726 Mon Sep 17 00:00:00 2001
From: Corentin Chary <cchary@commonit.com>
Date: Tue, 16 Feb 2010 10:57:09 +0100
Subject: [PATCH] pkcs11: win32 port

Signed-off-by: Corentin Chary <cchary@commonit.com>
---
 CMakeLists.txt      |  19 +++++++++++++++++--
 config.h            |  15 ++++++++++++++-
 ext/include/dlfcn.h |  45 ++++++++++++++++++++++++++++++++++++++++++++
 ext/lib/libdl.a     | Bin 0 -> 2460 bytes
 gck-rpc-dispatch.c  |  18 +++---------------
 gck-rpc-module.c    |  12 +++++++++---
 6 files changed, 88 insertions(+), 21 deletions(-)
 create mode 100644 ext/include/dlfcn.h
 create mode 100644 ext/lib/libdl.a

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 65d4007..24421d4 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,7 +2,22 @@ cmake_minimum_required (VERSION 2.6)
 
 project (pkcs11 C)
 
+set(PKCS11_PROXY_SRCS gck-rpc-module.c gck-rpc-message.c gck-rpc-util.c egg-buffer.c)
+set(PKCS11_DAEMON_SRCS egg-buffer.c gck-rpc-daemon-standalone.c gck-rpc-dispatch.c gck-rpc-message.c gck-rpc-util.c)
+
 add_definitions(-Wall)
-add_library(pkcs11-proxy.so SHARED gck-rpc-module.c gck-rpc-message.c egg-buffer.c)
-add_executable (pkcs11-daemon egg-buffer.c gck-rpc-daemon-standalone.c gck-rpc-dispatch.c gck-rpc-message.c gck-rpc-util.c)
+add_library(pkcs11-proxy SHARED ${PKCS11_PROXY_SRCS})
+add_executable (pkcs11-daemon ${PKCS11_DAEMON_SRCS})
+
+if (WIN32)
+  include_directories("ext/include")
+
+  add_library(dl STATIC IMPORTED)
+  set_property(TARGET dl PROPERTY
+               IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/ext/lib/libdl.a)
+  target_link_libraries (pkcs11-daemon ws2_32)
+  target_link_libraries (pkcs11-proxy ws2_32)
+endif ()
+
+target_link_libraries (pkcs11-proxy pthread)
 target_link_libraries (pkcs11-daemon dl pthread)
diff --git a/config.h b/config.h
index deb9594..35be6f9 100644
--- a/config.h
+++ b/config.h
@@ -6,11 +6,12 @@
 # include <stdint.h>
 # include <stdlib.h>
 # include <limits.h>
+# include <winsock2.h>
 
 typedef uint32_t __uid32_t;
 typedef uint32_t __gid32_t;
 typedef uint32_t uid_t;
-typedef size_t socklen_t;
+typedef int socklen_t;
 
 struct sockaddr_un {
 	uint16_t sun_family;
@@ -23,6 +24,18 @@ enum  {
 	SHUT_RDWR /* No more receptions or transmissions.  */
 };
 
+#ifdef  __MINGW32__
+static inline int inet_aton(const char * cp, struct in_addr *pin)
+{
+        int rc = inet_addr(cp);
+        if (rc == -1 && strcmp(cp, "255.255.255.255"))
+                return 0;
+
+        pin->s_addr = rc;
+        return 1;
+}
+#endif
+
 #endif
 
 #endif	/* CONFIG_H */
diff --git a/ext/include/dlfcn.h b/ext/include/dlfcn.h
new file mode 100644
index 0000000..dfc2551
--- /dev/null
+++ b/ext/include/dlfcn.h
@@ -0,0 +1,45 @@
+/*
+ * dlfcn-win32
+ * Copyright (c) 2007 Ramiro Polla
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#ifndef DLFCN_H
+#define DLFCN_H
+
+/* POSIX says these are implementation-defined.
+ * To simplify use with Windows API, we treat them the same way.
+ */
+
+#define RTLD_LAZY   0
+#define RTLD_NOW    0
+
+#define RTLD_GLOBAL (1 << 1)
+#define RTLD_LOCAL  (1 << 2)
+
+/* These two were added in The Open Group Base Specifications Issue 6.
+ * Note: All other RTLD_* flags in any dlfcn.h are not standard compliant.
+ */
+
+#define RTLD_DEFAULT    0
+#define RTLD_NEXT       0
+
+void *dlopen ( const char *file, int mode );
+int   dlclose( void *handle );
+void *dlsym  ( void *handle, const char *name );
+char *dlerror( void );
+
+#endif /* DLFCN_H */
diff --git a/ext/lib/libdl.a b/ext/lib/libdl.a
new file mode 100644
index 0000000000000000000000000000000000000000..24371c2d76496c10690224c9606a0c799c993dc0
GIT binary patch
literal 2460
zcmZ`*ZERCj7=F8zuGDIW6oEOgEG0@HqpdKQ4Ab&4h#9f6!1x$+U3&{_$~tdvmtpw9
zY)f`m3)SF1|Cnf^{4mClh(Jhnqm1~6Oih+xOiUC<Is>Q-Ld@!O&S~$u3~zGIdEV#!
zI`296o^w~V_~pRy*G=nfb04S6wR!W#W@mGg&F0{$%HC$%xS?#{Wg;Ry+B=oa7mP@<
z9F++mcJc%pqJ2^?8v~JOOd<+KLV@1KsFwKuGCCcOrY6k7<=V7K<m@uF=~zOdDg)6<
zj`X@lMH)~z7TwiqqKkm1gekoYY$HckW6-boE9{;I-Q>tMcE@6sIveRKMUGFCJJ%@B
z4QPg@uavXwfOzhYYZ2ha0@kx<WM9Yr_QaG~y*|lAb%))U%2|>{;LD6~P8XJBhtAXj
zwr(4onSsKRG{IMWFkF?)#ed5WG96{Eu_5)RCHV_R_5Pz<3yQEsth0AO4DX}lxFvZT
z(0S8&yI{(y-w#{YB*zuwko6@`^SAMP>R4W1L+V(j-l0xBx|O-Y0%pGCQKl_tKNqgK
zuNn$wb!_<kD#&m*4OweE%@5*J>X`anUcZzw^~>H0(<SD%X2P3EuqfW+?9C`D_WCd#
zCosI$jK2C%;<2vZobk?_zRc{NRh}0s!-T}B`S4NSk&)AvERam`-}CP>nhHOsik4Je
zu~>BG?!JlP8@4ES|Cs@C6I2t^j05xngtB6Nt!c&nO8S(2-R#PD>=!FOa_~qhr<m1=
za>7s+`w<p%RIh_=&MPZG?c?^4)yI>q$TsV7jnB)NP4^p9)5?!&0|Ne?m@;;FODPT<
zO5Ij|t&CAPm+2>L{ovF(Y-akRy#>SU<ia}Pc?0QE)0QM(eH4}Hv@a|?H>9uIrrsKS
zQVk!aZdh+f=9I-P>*Igq^>v+^CVnTs!@7{XVPlxuMY#L{7A%YDPABaf;9aF`y~HLT
z%5HHeuCyC3U;N<}UXDJLRY%g>8S{uOh`CgLEs8U$+l}f0z3PCXLxjFRILa!)mW?p$
z((>im{B!XMFE$<@DP=ygFNalWIunyK{}zjh(b~e->cr$<z=bc^*WgHZ+FNE9qda*Y
zOKHGTF5=%tc1xYolHO}fjmIB4bExcmE-`99e00RyE|PWHS7@2ei%fIu(r*}3Hx)yA
zn_l(k(WA0zb+-}o-&-zrj(r0)yoR%5V09ny&zHTJ2C6|XP#w@>G%Kw|zX;7hP3VPo
zuZ9k4=z@mEfP}|=jWb}WtdOj<3`j&-rJ>atdR0U0EfRKv8hQ_C36F9C=mn0h0xjj}
zC(Z7jW=HtAg?1&7h_?o48TS|fTF%i2n)VY7T>*NLYkvR|9(RF6-X}n!${L)@E4bZS
zAdzDu5L-hl?b5hoK*Hl~AmQ;DP(8P64E02CiSUOV1IKjYJ_(dKHfVPcu#Rk0g*u=1
zu)~@i%LvY!*h_ZiFfYautwLjruqj<?)Q5;XGBcs|ysxm~H=Y@l3!C!YXG0LdRNh%^
za@9I^Yq6VZ_NlzD5DGT4x-zP~tN09cHe{IlRNhmp;%eP9a}7$;)(V#8Bib{M>6*vL
z^O!U9m=EVMpUz|Wp;Th4$algYi9`b>89PY6kSvw=orp8BKDnn?2?-;{+yL|i;<7CD
zD!$TRNX*|aG3<*e_$T3{uR9(JNsvN4a!m0>yTejIA>S@ZY4gXFo$T+$?I2%kR6gNX
z_DHdq|Cr=)yEbzZuN)0{f<YOyTQGZ~!FWX4?eE2(kH@`%eB0T7j*ywyE{T}1lbGBV
a^#|K}x@Et7a_4}@?Q|g(YAaE&F#QMU{w2}?

literal 0
HcmV?d00001

diff --git a/gck-rpc-dispatch.c b/gck-rpc-dispatch.c
index dc2ff76..7dab038 100644
--- a/gck-rpc-dispatch.c
+++ b/gck-rpc-dispatch.c
@@ -2006,7 +2006,7 @@ static int read_all(int sock, unsigned char *data, size_t len)
 
 	while (len > 0) {
 
-		r = recv(sock, data, len, 0);
+                r = recv(sock, (void *)data, len, 0);
 
 		if (r == 0) {
 			/* Connection was closed on client */
@@ -2035,7 +2035,7 @@ static int write_all(int sock, unsigned char *data, size_t len)
 
 	while (len > 0) {
 
-		r = send(sock, data, len, 0);
+                r = send(sock, (void *)data, len, 0);
 
 		if (r == -1) {
 			if (errno == EPIPE) {
@@ -2204,18 +2204,6 @@ void gck_rpc_layer_accept(void)
 	pkcs11_dispatchers = ds;
 }
 
-#ifdef  __MINGW32__
-int inet_aton(const char * cp, struct in_addr *pin)
-{
-        int rc = inet_addr(cp);
-        if (rc == -1 && strcmp(cp, "255.255.255.255"))
-                return 0;
-
-        pin->s_addr = rc;
-        return 1;
-}
-#endif
-
 int gck_rpc_layer_initialize(const char *prefix, CK_FUNCTION_LIST_PTR module)
 {
 	struct sockaddr_un addr;
@@ -2281,7 +2269,7 @@ int gck_rpc_layer_initialize(const char *prefix, CK_FUNCTION_LIST_PTR module)
                 }
 
 		if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,
-			       &one, sizeof(one)) == -1) {
+                               (char *)&one, sizeof(one)) == -1) {
 			gck_rpc_warn
 			    ("couldn't create set pkcs11 socket options : %s",
 			     strerror(errno));
diff --git a/gck-rpc-module.c b/gck-rpc-module.c
index c4d0751..228dc01 100644
--- a/gck-rpc-module.c
+++ b/gck-rpc-module.c
@@ -30,11 +30,15 @@
 
 #include <sys/types.h>
 #include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/un.h>
+#ifdef __MINGW32__
+# include <winsock2.h>
+#else
+# include <sys/socket.h>
+# include <sys/un.h>
 #include <arpa/inet.h>
 #include <netinet/in.h>
 #include <netinet/tcp.h>
+#endif
 
 #include <stdlib.h>
 #include <limits.h>
@@ -280,12 +284,14 @@ static CK_RV call_connect(CallState * cs)
 		}
 	}
 
-	/* close on exec */
+#ifndef __MINGW32__
+        /* close on exec */
 	if (fcntl(sock, F_SETFD, 1) == -1) {
 		close(sock);
 		warning(("couldn't secure socket: %s", strerror(errno)));
 		return CKR_DEVICE_ERROR;
 	}
+#endif
 
 	if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
 		close(sock);
-- 
GitLab