aboutsummaryrefslogtreecommitdiff
path: root/crypto
diff options
context:
space:
mode:
authorBrent Cook <busterb@gmail.com>2014-07-10 22:06:10 -0500
committerBrent Cook <bcook@openbsd.org>2015-07-21 12:08:18 -0500
commit5d8a1cf7155130bd8101090d7e1d0c2f90d9b123 (patch)
tree286f7d12e3647f94bd1e6e8e180a4bf6215a0740 /crypto
parent7a4a37cf596697ae96eeb1c555989e6d1a443187 (diff)
downloadportable-5d8a1cf7155130bd8101090d7e1d0c2f90d9b123.tar.gz
portable-5d8a1cf7155130bd8101090d7e1d0c2f90d9b123.tar.bz2
portable-5d8a1cf7155130bd8101090d7e1d0c2f90d9b123.zip
add initial CMake and Visual Studio build support
This moves the compatibility include files from include to include/compat so we can use the awful MS C compiler <../include/> trick to emulate the GNU #include_next extension. This also removes a few old compat files we do not need anymore.
Diffstat (limited to 'crypto')
-rw-r--r--crypto/CMakeLists.txt624
-rw-r--r--crypto/Makefile.am3
-rw-r--r--crypto/compat/posix_win.c24
3 files changed, 651 insertions, 0 deletions
diff --git a/crypto/CMakeLists.txt b/crypto/CMakeLists.txt
new file mode 100644
index 0000000..1a058c4
--- /dev/null
+++ b/crypto/CMakeLists.txt
@@ -0,0 +1,624 @@
1include_directories(
2 .
3 ../include
4 ../include/compat
5 asn1
6 dsa
7 evp
8 modes
9)
10
11set(
12 CRYPTO_SRC
13
14 aes/aes_cbc.c
15 aes/aes_core.c
16 camellia/camellia.c
17 camellia/cmll_cbc.c
18 rc4/rc4_enc.c
19 rc4/rc4_skey.c
20 whrlpool/wp_block.c
21 cpt_err.c
22 cryptlib.c
23 cversion.c
24 ex_data.c
25 malloc-wrapper.c
26 mem_clr.c
27 mem_dbg.c
28 o_init.c
29 o_str.c
30 o_time.c
31 aes/aes_cfb.c
32 aes/aes_ctr.c
33 aes/aes_ecb.c
34 aes/aes_ige.c
35 aes/aes_misc.c
36 aes/aes_ofb.c
37 aes/aes_wrap.c
38 asn1/a_bitstr.c
39 asn1/a_bool.c
40 asn1/a_bytes.c
41 asn1/a_d2i_fp.c
42 asn1/a_digest.c
43 asn1/a_dup.c
44 asn1/a_enum.c
45 asn1/a_gentm.c
46 asn1/a_i2d_fp.c
47 asn1/a_int.c
48 asn1/a_mbstr.c
49 asn1/a_object.c
50 asn1/a_octet.c
51 asn1/a_print.c
52 asn1/a_set.c
53 asn1/a_sign.c
54 asn1/a_strex.c
55 asn1/a_strnid.c
56 asn1/a_time.c
57 asn1/a_type.c
58 asn1/a_utctm.c
59 asn1/a_utf8.c
60 asn1/a_verify.c
61 asn1/ameth_lib.c
62 asn1/asn1_err.c
63 asn1/asn1_gen.c
64 asn1/asn1_lib.c
65 asn1/asn1_par.c
66 asn1/asn_mime.c
67 asn1/asn_moid.c
68 asn1/asn_pack.c
69 asn1/bio_asn1.c
70 asn1/bio_ndef.c
71 asn1/d2i_pr.c
72 asn1/d2i_pu.c
73 asn1/evp_asn1.c
74 asn1/f_enum.c
75 asn1/f_int.c
76 asn1/f_string.c
77 asn1/i2d_pr.c
78 asn1/i2d_pu.c
79 asn1/n_pkey.c
80 asn1/nsseq.c
81 asn1/p5_pbe.c
82 asn1/p5_pbev2.c
83 asn1/p8_pkey.c
84 asn1/t_bitst.c
85 asn1/t_crl.c
86 asn1/t_pkey.c
87 asn1/t_req.c
88 asn1/t_spki.c
89 asn1/t_x509.c
90 asn1/t_x509a.c
91 asn1/tasn_dec.c
92 asn1/tasn_enc.c
93 asn1/tasn_fre.c
94 asn1/tasn_new.c
95 asn1/tasn_prn.c
96 asn1/tasn_typ.c
97 asn1/tasn_utl.c
98 asn1/x_algor.c
99 asn1/x_attrib.c
100 asn1/x_bignum.c
101 asn1/x_crl.c
102 asn1/x_exten.c
103 asn1/x_info.c
104 asn1/x_long.c
105 asn1/x_name.c
106 asn1/x_nx509.c
107 asn1/x_pkey.c
108 asn1/x_pubkey.c
109 asn1/x_req.c
110 asn1/x_sig.c
111 asn1/x_spki.c
112 asn1/x_val.c
113 asn1/x_x509.c
114 asn1/x_x509a.c
115 bf/bf_cfb64.c
116 bf/bf_ecb.c
117 bf/bf_enc.c
118 bf/bf_ofb64.c
119 bf/bf_skey.c
120 bio/b_dump.c
121 bio/b_print.c
122 bio/b_sock.c
123 bio/bf_buff.c
124 bio/bf_nbio.c
125 bio/bf_null.c
126 bio/bio_cb.c
127 bio/bio_err.c
128 bio/bio_lib.c
129 bio/bss_acpt.c
130 bio/bss_bio.c
131 bio/bss_conn.c
132 bio/bss_dgram.c
133 bio/bss_fd.c
134 bio/bss_file.c
135 bio/bss_mem.c
136 bio/bss_null.c
137 bio/bss_sock.c
138 bn/bn_add.c
139 bn/bn_asm.c
140 bn/bn_blind.c
141 bn/bn_const.c
142 bn/bn_ctx.c
143 bn/bn_depr.c
144 bn/bn_div.c
145 bn/bn_err.c
146 bn/bn_exp.c
147 bn/bn_exp2.c
148 bn/bn_gcd.c
149 bn/bn_gf2m.c
150 bn/bn_kron.c
151 bn/bn_lib.c
152 bn/bn_mod.c
153 bn/bn_mont.c
154 bn/bn_mpi.c
155 bn/bn_mul.c
156 bn/bn_nist.c
157 bn/bn_prime.c
158 bn/bn_print.c
159 bn/bn_rand.c
160 bn/bn_recp.c
161 bn/bn_shift.c
162 bn/bn_sqr.c
163 bn/bn_sqrt.c
164 bn/bn_word.c
165 bn/bn_x931p.c
166 buffer/buf_err.c
167 buffer/buf_str.c
168 buffer/buffer.c
169 camellia/cmll_cfb.c
170 camellia/cmll_ctr.c
171 camellia/cmll_ecb.c
172 camellia/cmll_misc.c
173 camellia/cmll_ofb.c
174 cast/c_cfb64.c
175 cast/c_ecb.c
176 cast/c_enc.c
177 cast/c_ofb64.c
178 cast/c_skey.c
179 chacha/chacha.c
180 cmac/cm_ameth.c
181 cmac/cm_pmeth.c
182 cmac/cmac.c
183 comp/c_rle.c
184 comp/c_zlib.c
185 comp/comp_err.c
186 comp/comp_lib.c
187 conf/conf_api.c
188 conf/conf_def.c
189 conf/conf_err.c
190 conf/conf_lib.c
191 conf/conf_mall.c
192 conf/conf_mod.c
193 conf/conf_sap.c
194 des/cbc_cksm.c
195 des/cbc_enc.c
196 des/cfb64ede.c
197 des/cfb64enc.c
198 des/cfb_enc.c
199 des/des_enc.c
200 des/ecb3_enc.c
201 des/ecb_enc.c
202 des/ede_cbcm_enc.c
203 des/enc_read.c
204 des/enc_writ.c
205 des/fcrypt.c
206 des/fcrypt_b.c
207 des/ofb64ede.c
208 des/ofb64enc.c
209 des/ofb_enc.c
210 des/pcbc_enc.c
211 des/qud_cksm.c
212 des/rand_key.c
213 des/set_key.c
214 des/str2key.c
215 des/xcbc_enc.c
216 dh/dh_ameth.c
217 dh/dh_asn1.c
218 dh/dh_check.c
219 dh/dh_depr.c
220 dh/dh_err.c
221 dh/dh_gen.c
222 dh/dh_key.c
223 dh/dh_lib.c
224 dh/dh_pmeth.c
225 dh/dh_prn.c
226 dsa/dsa_ameth.c
227 dsa/dsa_asn1.c
228 dsa/dsa_depr.c
229 dsa/dsa_err.c
230 dsa/dsa_gen.c
231 dsa/dsa_key.c
232 dsa/dsa_lib.c
233 dsa/dsa_ossl.c
234 dsa/dsa_pmeth.c
235 dsa/dsa_prn.c
236 dsa/dsa_sign.c
237 dsa/dsa_vrf.c
238 dso/dso_dlfcn.c
239 dso/dso_err.c
240 dso/dso_lib.c
241 dso/dso_null.c
242 dso/dso_openssl.c
243 ec/ec2_mult.c
244 ec/ec2_oct.c
245 ec/ec2_smpl.c
246 ec/ec_ameth.c
247 ec/ec_asn1.c
248 ec/ec_check.c
249 ec/ec_curve.c
250 ec/ec_cvt.c
251 ec/ec_err.c
252 ec/ec_key.c
253 ec/ec_lib.c
254 ec/ec_mult.c
255 ec/ec_oct.c
256 ec/ec_pmeth.c
257 ec/ec_print.c
258 ec/eck_prn.c
259 ec/ecp_mont.c
260 ec/ecp_nist.c
261 ec/ecp_oct.c
262 ec/ecp_smpl.c
263 ecdh/ech_err.c
264 ecdh/ech_key.c
265 ecdh/ech_lib.c
266 ecdh/ech_ossl.c
267 ecdsa/ecs_asn1.c
268 ecdsa/ecs_err.c
269 ecdsa/ecs_lib.c
270 ecdsa/ecs_ossl.c
271 ecdsa/ecs_sign.c
272 ecdsa/ecs_vrf.c
273 engine/eng_all.c
274 engine/eng_cnf.c
275 engine/eng_ctrl.c
276 engine/eng_dyn.c
277 engine/eng_err.c
278 engine/eng_fat.c
279 engine/eng_init.c
280 engine/eng_lib.c
281 engine/eng_list.c
282 engine/eng_openssl.c
283 engine/eng_pkey.c
284 engine/eng_rsax.c
285 engine/eng_table.c
286 engine/tb_asnmth.c
287 engine/tb_cipher.c
288 engine/tb_dh.c
289 engine/tb_digest.c
290 engine/tb_dsa.c
291 engine/tb_ecdh.c
292 engine/tb_ecdsa.c
293 engine/tb_pkmeth.c
294 engine/tb_rand.c
295 engine/tb_rsa.c
296 engine/tb_store.c
297 err/err.c
298 err/err_all.c
299 err/err_prn.c
300 evp/bio_b64.c
301 evp/bio_enc.c
302 evp/bio_md.c
303 evp/c_all.c
304 evp/digest.c
305 evp/e_aes.c
306 evp/e_aes_cbc_hmac_sha1.c
307 evp/e_bf.c
308 evp/e_camellia.c
309 evp/e_cast.c
310 evp/e_chacha.c
311 evp/e_chacha20poly1305.c
312 evp/e_des.c
313 evp/e_des3.c
314 evp/e_gost2814789.c
315 evp/e_idea.c
316 evp/e_null.c
317 evp/e_old.c
318 evp/e_rc2.c
319 evp/e_rc4.c
320 evp/e_rc4_hmac_md5.c
321 evp/e_xcbc_d.c
322 evp/encode.c
323 evp/evp_aead.c
324 evp/evp_enc.c
325 evp/evp_err.c
326 evp/evp_key.c
327 evp/evp_lib.c
328 evp/evp_pbe.c
329 evp/evp_pkey.c
330 evp/m_dss.c
331 evp/m_dss1.c
332 evp/m_ecdsa.c
333 evp/m_gost2814789.c
334 evp/m_gostr341194.c
335 evp/m_md4.c
336 evp/m_md5.c
337 evp/m_null.c
338 evp/m_ripemd.c
339 evp/m_sha.c
340 evp/m_sha1.c
341 evp/m_sigver.c
342 evp/m_streebog.c
343 evp/m_wp.c
344 evp/names.c
345 evp/p5_crpt.c
346 evp/p5_crpt2.c
347 evp/p_dec.c
348 evp/p_enc.c
349 evp/p_lib.c
350 evp/p_open.c
351 evp/p_seal.c
352 evp/p_sign.c
353 evp/p_verify.c
354 evp/pmeth_fn.c
355 evp/pmeth_gn.c
356 evp/pmeth_lib.c
357 gost/gost2814789.c
358 gost/gost89_keywrap.c
359 gost/gost89_params.c
360 gost/gost89imit_ameth.c
361 gost/gost89imit_pmeth.c
362 gost/gost_asn1.c
363 gost/gost_err.c
364 gost/gostr341001.c
365 gost/gostr341001_ameth.c
366 gost/gostr341001_key.c
367 gost/gostr341001_params.c
368 gost/gostr341001_pmeth.c
369 gost/gostr341194.c
370 gost/streebog.c
371 hmac/hm_ameth.c
372 hmac/hm_pmeth.c
373 hmac/hmac.c
374 idea/i_cbc.c
375 idea/i_cfb64.c
376 idea/i_ecb.c
377 idea/i_ofb64.c
378 idea/i_skey.c
379 krb5/krb5_asn.c
380 lhash/lh_stats.c
381 lhash/lhash.c
382 md4/md4_dgst.c
383 md4/md4_one.c
384 md5/md5_dgst.c
385 md5/md5_one.c
386 modes/cbc128.c
387 modes/ccm128.c
388 modes/cfb128.c
389 modes/ctr128.c
390 modes/cts128.c
391 modes/gcm128.c
392 modes/ofb128.c
393 modes/xts128.c
394 objects/o_names.c
395 objects/obj_dat.c
396 objects/obj_err.c
397 objects/obj_lib.c
398 objects/obj_xref.c
399 ocsp/ocsp_asn.c
400 ocsp/ocsp_cl.c
401 ocsp/ocsp_err.c
402 ocsp/ocsp_ext.c
403 ocsp/ocsp_ht.c
404 ocsp/ocsp_lib.c
405 ocsp/ocsp_prn.c
406 ocsp/ocsp_srv.c
407 ocsp/ocsp_vfy.c
408 pem/pem_all.c
409 pem/pem_err.c
410 pem/pem_info.c
411 pem/pem_lib.c
412 pem/pem_oth.c
413 pem/pem_pk8.c
414 pem/pem_pkey.c
415 pem/pem_seal.c
416 pem/pem_sign.c
417 pem/pem_x509.c
418 pem/pem_xaux.c
419 pem/pvkfmt.c
420 pkcs12/p12_add.c
421 pkcs12/p12_asn.c
422 pkcs12/p12_attr.c
423 pkcs12/p12_crpt.c
424 pkcs12/p12_crt.c
425 pkcs12/p12_decr.c
426 pkcs12/p12_init.c
427 pkcs12/p12_key.c
428 pkcs12/p12_kiss.c
429 pkcs12/p12_mutl.c
430 pkcs12/p12_npas.c
431 pkcs12/p12_p8d.c
432 pkcs12/p12_p8e.c
433 pkcs12/p12_utl.c
434 pkcs12/pk12err.c
435 pkcs7/bio_pk7.c
436 pkcs7/pk7_asn1.c
437 pkcs7/pk7_attr.c
438 pkcs7/pk7_doit.c
439 pkcs7/pk7_lib.c
440 pkcs7/pk7_mime.c
441 pkcs7/pk7_smime.c
442 pkcs7/pkcs7err.c
443 poly1305/poly1305.c
444 rand/rand_err.c
445 rand/rand_lib.c
446 rand/randfile.c
447 rc2/rc2_cbc.c
448 rc2/rc2_ecb.c
449 rc2/rc2_skey.c
450 rc2/rc2cfb64.c
451 rc2/rc2ofb64.c
452 ripemd/rmd_dgst.c
453 ripemd/rmd_one.c
454 rsa/rsa_ameth.c
455 rsa/rsa_asn1.c
456 rsa/rsa_chk.c
457 rsa/rsa_crpt.c
458 rsa/rsa_depr.c
459 rsa/rsa_eay.c
460 rsa/rsa_err.c
461 rsa/rsa_gen.c
462 rsa/rsa_lib.c
463 rsa/rsa_none.c
464 rsa/rsa_oaep.c
465 rsa/rsa_pk1.c
466 rsa/rsa_pmeth.c
467 rsa/rsa_prn.c
468 rsa/rsa_pss.c
469 rsa/rsa_saos.c
470 rsa/rsa_sign.c
471 rsa/rsa_ssl.c
472 rsa/rsa_x931.c
473 sha/sha1_one.c
474 sha/sha1dgst.c
475 sha/sha256.c
476 sha/sha512.c
477 sha/sha_dgst.c
478 sha/sha_one.c
479 stack/stack.c
480 ts/ts_asn1.c
481 ts/ts_conf.c
482 ts/ts_err.c
483 ts/ts_lib.c
484 ts/ts_req_print.c
485 ts/ts_req_utils.c
486 ts/ts_rsp_print.c
487 ts/ts_rsp_sign.c
488 ts/ts_rsp_utils.c
489 ts/ts_rsp_verify.c
490 ts/ts_verify_ctx.c
491 txt_db/txt_db.c
492 ui/ui_err.c
493 ui/ui_lib.c
494 ui/ui_util.c
495 whrlpool/wp_dgst.c
496 x509/by_dir.c
497 x509/by_file.c
498 x509/by_mem.c
499 x509/x509_att.c
500 x509/x509_cmp.c
501 x509/x509_d2.c
502 x509/x509_def.c
503 x509/x509_err.c
504 x509/x509_ext.c
505 x509/x509_lu.c
506 x509/x509_obj.c
507 x509/x509_r2x.c
508 x509/x509_req.c
509 x509/x509_set.c
510 x509/x509_trs.c
511 x509/x509_txt.c
512 x509/x509_v3.c
513 x509/x509_vfy.c
514 x509/x509_vpm.c
515 x509/x509cset.c
516 x509/x509name.c
517 x509/x509rset.c
518 x509/x509spki.c
519 x509/x509type.c
520 x509/x_all.c
521 x509v3/pcy_cache.c
522 x509v3/pcy_data.c
523 x509v3/pcy_lib.c
524 x509v3/pcy_map.c
525 x509v3/pcy_node.c
526 x509v3/pcy_tree.c
527 x509v3/v3_akey.c
528 x509v3/v3_akeya.c
529 x509v3/v3_alt.c
530 x509v3/v3_bcons.c
531 x509v3/v3_bitst.c
532 x509v3/v3_conf.c
533 x509v3/v3_cpols.c
534 x509v3/v3_crld.c
535 x509v3/v3_enum.c
536 x509v3/v3_extku.c
537 x509v3/v3_genn.c
538 x509v3/v3_ia5.c
539 x509v3/v3_info.c
540 x509v3/v3_int.c
541 x509v3/v3_lib.c
542 x509v3/v3_ncons.c
543 x509v3/v3_ocsp.c
544 x509v3/v3_pci.c
545 x509v3/v3_pcia.c
546 x509v3/v3_pcons.c
547 x509v3/v3_pku.c
548 x509v3/v3_pmaps.c
549 x509v3/v3_prn.c
550 x509v3/v3_purp.c
551 x509v3/v3_skey.c
552 x509v3/v3_sxnet.c
553 x509v3/v3_utl.c
554 x509v3/v3err.c
555)
556
557if(CMAKE_HOST_UNIX)
558 set(CRYPTO_SRC ${CRYPTO_SRC} bio/b_posix.c)
559 set(CRYPTO_SRC ${CRYPTO_SRC} bio/bss_log.c)
560 set(CRYPTO_SRC ${CRYPTO_SRC} ui/ui_openssl.c)
561endif()
562
563if(CMAKE_HOST_WIN32)
564 set(CRYPTO_SRC ${CRYPTO_SRC} bio/b_win.c)
565 set(CRYPTO_SRC ${CRYPTO_SRC} ui/ui_openssl_win.c)
566endif()
567
568if(CMAKE_HOST_WIN32)
569 set(CRYPTO_SRC ${CRYPTO_SRC} compat/posix_win.c)
570 set(CRYPTO_SRC ${CRYPTO_SRC} compat/arc4random.c)
571 set(CRYPTO_SRC ${CRYPTO_SRC} compat/getentropy_win.c)
572endif()
573
574if(NOT HAVE_ASPRINTF)
575 set(CRYPTO_SRC ${CRYPTO_SRC} compat/bsd-asprintf.c)
576endif()
577
578if(NOT HAVE_INET_PTON)
579 set(CRYPTO_SRC ${CRYPTO_SRC} compat/inet_pton.c)
580endif()
581
582if(NOT HAVE_REALLOCARRAY)
583 set(CRYPTO_SRC ${CRYPTO_SRC} compat/reallocarray.c)
584endif()
585
586if(NOT HAVE_STRCASECMP)
587 set(CRYPTO_SRC ${CRYPTO_SRC} compat/strcasecmp.c)
588endif()
589
590if(NOT HAVE_STRLCAT)
591 set(CRYPTO_SRC ${CRYPTO_SRC} compat/strlcat.c)
592endif()
593
594if(NOT HAVE_STRLCPY)
595 set(CRYPTO_SRC ${CRYPTO_SRC} compat/strlcpy.c)
596endif()
597
598if(NOT HAVE_STRNDUP)
599 set(CRYPTO_SRC ${CRYPTO_SRC} compat/strndup.c)
600 if(NOT HAVE_STRNLEN)
601 set(CRYPTO_SRC ${CRYPTO_SRC} compat/strnlen.c)
602 endif()
603endif()
604
605if(NOT HAVE_EXPLICIT_BZERO)
606 if(CMAKE_HOST_WIN32)
607 set(CRYPTO_SRC ${CRYPTO_SRC} compat/explicit_bzero_win.c)
608 else()
609 set(CRYPTO_SRC ${CRYPTO_SRC} compat/explicit_bzero.c)
610 endif()
611endif()
612
613if(NOT HAVE_GETENTROPY)
614endif()
615
616if(NOT HAVE_TIMINGSAFE_BCMP)
617 set(CRYPTO_SRC ${CRYPTO_SRC} compat/timingsafe_bcmp.c)
618endif()
619
620if(NOT HAVE_TIMINGSAFE_MEMCMP)
621 set(CRYPTO_SRC ${CRYPTO_SRC} compat/timingsafe_memcmp.c)
622endif()
623
624add_library(crypto ${CRYPTO_SRC})
diff --git a/crypto/Makefile.am b/crypto/Makefile.am
index 1799969..b988d77 100644
--- a/crypto/Makefile.am
+++ b/crypto/Makefile.am
@@ -7,6 +7,7 @@ AM_CFLAGS += -I$(top_srcdir)/crypto/modes
7lib_LTLIBRARIES = libcrypto.la 7lib_LTLIBRARIES = libcrypto.la
8 8
9EXTRA_DIST = VERSION 9EXTRA_DIST = VERSION
10EXTRA_DIST += CMakeLists.txt
10 11
11libcrypto_la_LDFLAGS = -version-info @LIBCRYPTO_VERSION@ -no-undefined 12libcrypto_la_LDFLAGS = -version-info @LIBCRYPTO_VERSION@ -no-undefined
12libcrypto_la_LIBADD = libcompat.la libcompatnoopt.la 13libcrypto_la_LIBADD = libcompat.la libcompatnoopt.la
@@ -236,7 +237,9 @@ libcrypto_la_SOURCES += bio/bss_conn.c
236libcrypto_la_SOURCES += bio/bss_dgram.c 237libcrypto_la_SOURCES += bio/bss_dgram.c
237libcrypto_la_SOURCES += bio/bss_fd.c 238libcrypto_la_SOURCES += bio/bss_fd.c
238libcrypto_la_SOURCES += bio/bss_file.c 239libcrypto_la_SOURCES += bio/bss_file.c
240if !HOST_WIN
239libcrypto_la_SOURCES += bio/bss_log.c 241libcrypto_la_SOURCES += bio/bss_log.c
242endif
240libcrypto_la_SOURCES += bio/bss_mem.c 243libcrypto_la_SOURCES += bio/bss_mem.c
241libcrypto_la_SOURCES += bio/bss_null.c 244libcrypto_la_SOURCES += bio/bss_null.c
242libcrypto_la_SOURCES += bio/bss_sock.c 245libcrypto_la_SOURCES += bio/bss_sock.c
diff --git a/crypto/compat/posix_win.c b/crypto/compat/posix_win.c
index 855406b..f8a46ab 100644
--- a/crypto/compat/posix_win.c
+++ b/crypto/compat/posix_win.c
@@ -166,3 +166,27 @@ posix_setsockopt(int sockfd, int level, int optname,
166 int rc = setsockopt(sockfd, level, optname, (char *)optval, optlen); 166 int rc = setsockopt(sockfd, level, optname, (char *)optval, optlen);
167 return rc == 0 ? 0 : wsa_errno(WSAGetLastError()); 167 return rc == 0 ? 0 : wsa_errno(WSAGetLastError());
168} 168}
169
170#ifdef _MSC_VER
171int gettimeofday(struct timeval * tp, struct timezone * tzp)
172{
173 /*
174 * Note: some broken versions only have 8 trailing zero's, the correct
175 * epoch has 9 trailing zero's
176 */
177 static const uint64_t EPOCH = ((uint64_t) 116444736000000000ULL);
178
179 SYSTEMTIME system_time;
180 FILETIME file_time;
181 uint64_t time;
182
183 GetSystemTime(&system_time);
184 SystemTimeToFileTime(&system_time, &file_time);
185 time = ((uint64_t)file_time.dwLowDateTime);
186 time += ((uint64_t)file_time.dwHighDateTime) << 32;
187
188 tp->tv_sec = (long)((time - EPOCH) / 10000000L);
189 tp->tv_usec = (long)(system_time.wMilliseconds * 1000);
190 return 0;
191}
192#endif