diff --git a/CMakeLists.txt.user b/CMakeLists.txt.user
new file mode 100644
index 00000000..47220290
--- /dev/null
+++ b/CMakeLists.txt.user
@@ -0,0 +1,371 @@
+
+
+
+
+
+ EnvironmentId
+ {d2097749-f678-439b-ab23-75844ed126ff}
+
+
+ ProjectExplorer.Project.ActiveTarget
+ 0
+
+
+ ProjectExplorer.Project.EditorSettings
+
+ true
+ false
+ true
+
+ Cpp
+
+ CppGlobal
+
+
+
+ QmlJS
+
+ QmlJSGlobal
+
+
+ 2
+ UTF-8
+ false
+ 4
+ false
+ 80
+ true
+ true
+ 1
+ true
+ false
+ 0
+ true
+ true
+ 0
+ 8
+ true
+ 1
+ true
+ true
+ true
+ false
+
+
+
+ ProjectExplorer.Project.PluginSettings
+
+
+
+ ProjectExplorer.Project.Target.0
+
+ Desktop Qt 5.8.0 MSVC2015_64bit
+ Desktop Qt 5.8.0 MSVC2015_64bit
+ qt.58.win64_msvc2015_64_kit
+ 0
+ 0
+ 0
+
+
+ C:/Projects/build-synergy-core-Desktop_Qt_5_8_0_MSVC2015_64bit-Default
+
+
+
+
+
+
+ true
+ Make
+
+ CMakeProjectManager.MakeStep
+
+ 1
+ Build
+
+ ProjectExplorer.BuildSteps.Build
+
+
+
+
+
+ clean
+
+ true
+ Make
+
+ CMakeProjectManager.MakeStep
+
+ 1
+ Clean
+
+ ProjectExplorer.BuildSteps.Clean
+
+ 2
+ false
+
+ Default
+ Default
+ CMakeProjectManager.CMakeBuildConfiguration
+
+
+
+ CMAKE_BUILD_TYPE:STRING=Debug
+
+ C:/Projects/build-synergy-core-Desktop_Qt_5_8_0_MSVC2015_64bit-Debug
+
+
+
+
+
+
+ true
+ Make
+
+ CMakeProjectManager.MakeStep
+
+ 1
+ Build
+
+ ProjectExplorer.BuildSteps.Build
+
+
+
+
+
+ clean
+
+ true
+ Make
+
+ CMakeProjectManager.MakeStep
+
+ 1
+ Clean
+
+ ProjectExplorer.BuildSteps.Clean
+
+ 2
+ false
+
+ Debug
+ Debug
+ CMakeProjectManager.CMakeBuildConfiguration
+
+
+
+ CMAKE_BUILD_TYPE:STRING=Release
+
+ C:/Projects/build-synergy-core-Desktop_Qt_5_8_0_MSVC2015_64bit-Release
+
+
+
+
+
+
+ true
+ Make
+
+ CMakeProjectManager.MakeStep
+
+ 1
+ Build
+
+ ProjectExplorer.BuildSteps.Build
+
+
+
+
+
+ clean
+
+ true
+ Make
+
+ CMakeProjectManager.MakeStep
+
+ 1
+ Clean
+
+ ProjectExplorer.BuildSteps.Clean
+
+ 2
+ false
+
+ Release
+ Release
+ CMakeProjectManager.CMakeBuildConfiguration
+
+
+
+ CMAKE_BUILD_TYPE:STRING=RelWithDebInfo
+
+ C:/Projects/build-synergy-core-Desktop_Qt_5_8_0_MSVC2015_64bit-Release with Debug Information
+
+
+
+
+
+
+ true
+ Make
+
+ CMakeProjectManager.MakeStep
+
+ 1
+ Build
+
+ ProjectExplorer.BuildSteps.Build
+
+
+
+
+
+ clean
+
+ true
+ Make
+
+ CMakeProjectManager.MakeStep
+
+ 1
+ Clean
+
+ ProjectExplorer.BuildSteps.Clean
+
+ 2
+ false
+
+ Release with Debug Information
+ Release with Debug Information
+ CMakeProjectManager.CMakeBuildConfiguration
+
+
+
+ CMAKE_BUILD_TYPE:STRING=MinSizeRel
+
+ C:/Projects/build-synergy-core-Desktop_Qt_5_8_0_MSVC2015_64bit-Minimum Size Release
+
+
+
+
+
+
+ true
+ Make
+
+ CMakeProjectManager.MakeStep
+
+ 1
+ Build
+
+ ProjectExplorer.BuildSteps.Build
+
+
+
+
+
+ clean
+
+ true
+ Make
+
+ CMakeProjectManager.MakeStep
+
+ 1
+ Clean
+
+ ProjectExplorer.BuildSteps.Clean
+
+ 2
+ false
+
+ Minimum Size Release
+ Minimum Size Release
+ CMakeProjectManager.CMakeBuildConfiguration
+
+ 5
+
+
+ 0
+ Deploy
+
+ ProjectExplorer.BuildSteps.Deploy
+
+ 1
+ Deploy locally
+
+ ProjectExplorer.DefaultDeployConfiguration
+
+ 1
+
+
+ false
+ false
+ 1000
+
+ true
+
+ false
+ false
+ false
+ false
+ true
+ 0.01
+ 10
+ true
+ 1
+ 25
+
+ 1
+ true
+ false
+ true
+ valgrind
+
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+ 10
+ 11
+ 12
+ 13
+ 14
+
+ 2
+
+
+
+ %{buildDir}
+ Custom Executable
+
+ ProjectExplorer.CustomExecutableRunConfiguration
+ 3768
+ false
+ true
+ false
+ false
+ true
+
+ 1
+
+
+
+ ProjectExplorer.Project.TargetCount
+ 1
+
+
+ ProjectExplorer.Project.Updater.FileVersion
+ 18
+
+
+ Version
+ 18
+
+
diff --git a/ext/openssl/windows/x64/bin/libeay32.dll b/ext/openssl/windows/x64/bin/libeay32.dll
index 92c3edac..96ab836a 100644
Binary files a/ext/openssl/windows/x64/bin/libeay32.dll and b/ext/openssl/windows/x64/bin/libeay32.dll differ
diff --git a/ext/openssl/windows/x64/bin/openssl.exe b/ext/openssl/windows/x64/bin/openssl.exe
index 9cdf68c4..5c4b361b 100644
Binary files a/ext/openssl/windows/x64/bin/openssl.exe and b/ext/openssl/windows/x64/bin/openssl.exe differ
diff --git a/ext/openssl/windows/x64/bin/ssleay32.dll b/ext/openssl/windows/x64/bin/ssleay32.dll
index 3b172b57..7798e081 100644
Binary files a/ext/openssl/windows/x64/bin/ssleay32.dll and b/ext/openssl/windows/x64/bin/ssleay32.dll differ
diff --git a/ext/openssl/windows/x64/include/openssl/asn1.h b/ext/openssl/windows/x64/include/openssl/asn1.h
index 68e791fc..35a2b2aa 100644
--- a/ext/openssl/windows/x64/include/openssl/asn1.h
+++ b/ext/openssl/windows/x64/include/openssl/asn1.h
@@ -1365,6 +1365,7 @@ void ERR_load_ASN1_strings(void);
# define ASN1_R_MSTRING_NOT_UNIVERSAL 139
# define ASN1_R_MSTRING_WRONG_TAG 140
# define ASN1_R_NESTED_ASN1_STRING 197
+# define ASN1_R_NESTED_TOO_DEEP 219
# define ASN1_R_NON_HEX_CHARACTERS 141
# define ASN1_R_NOT_ASCII_FORMAT 190
# define ASN1_R_NOT_ENOUGH_DATA 142
diff --git a/ext/openssl/windows/x64/include/openssl/dh.h b/ext/openssl/windows/x64/include/openssl/dh.h
index a228c7a7..80b28fb3 100644
--- a/ext/openssl/windows/x64/include/openssl/dh.h
+++ b/ext/openssl/windows/x64/include/openssl/dh.h
@@ -257,11 +257,13 @@ DH *DH_get_1024_160(void);
DH *DH_get_2048_224(void);
DH *DH_get_2048_256(void);
+# ifndef OPENSSL_NO_CMS
/* RFC2631 KDF */
int DH_KDF_X9_42(unsigned char *out, size_t outlen,
const unsigned char *Z, size_t Zlen,
ASN1_OBJECT *key_oid,
const unsigned char *ukm, size_t ukmlen, const EVP_MD *md);
+# endif
# define EVP_PKEY_CTX_set_dh_paramgen_prime_len(ctx, len) \
EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN, \
diff --git a/ext/openssl/windows/x64/include/openssl/evp.h b/ext/openssl/windows/x64/include/openssl/evp.h
index d258ef87..cf1de15e 100644
--- a/ext/openssl/windows/x64/include/openssl/evp.h
+++ b/ext/openssl/windows/x64/include/openssl/evp.h
@@ -1363,6 +1363,98 @@ void EVP_PKEY_meth_set_ctrl(EVP_PKEY_METHOD *pmeth,
const char *type,
const char *value));
+void EVP_PKEY_meth_get_init(EVP_PKEY_METHOD *pmeth,
+ int (**pinit) (EVP_PKEY_CTX *ctx));
+
+void EVP_PKEY_meth_get_copy(EVP_PKEY_METHOD *pmeth,
+ int (**pcopy) (EVP_PKEY_CTX *dst,
+ EVP_PKEY_CTX *src));
+
+void EVP_PKEY_meth_get_cleanup(EVP_PKEY_METHOD *pmeth,
+ void (**pcleanup) (EVP_PKEY_CTX *ctx));
+
+void EVP_PKEY_meth_get_paramgen(EVP_PKEY_METHOD *pmeth,
+ int (**pparamgen_init) (EVP_PKEY_CTX *ctx),
+ int (**pparamgen) (EVP_PKEY_CTX *ctx,
+ EVP_PKEY *pkey));
+
+void EVP_PKEY_meth_get_keygen(EVP_PKEY_METHOD *pmeth,
+ int (**pkeygen_init) (EVP_PKEY_CTX *ctx),
+ int (**pkeygen) (EVP_PKEY_CTX *ctx,
+ EVP_PKEY *pkey));
+
+void EVP_PKEY_meth_get_sign(EVP_PKEY_METHOD *pmeth,
+ int (**psign_init) (EVP_PKEY_CTX *ctx),
+ int (**psign) (EVP_PKEY_CTX *ctx,
+ unsigned char *sig, size_t *siglen,
+ const unsigned char *tbs,
+ size_t tbslen));
+
+void EVP_PKEY_meth_get_verify(EVP_PKEY_METHOD *pmeth,
+ int (**pverify_init) (EVP_PKEY_CTX *ctx),
+ int (**pverify) (EVP_PKEY_CTX *ctx,
+ const unsigned char *sig,
+ size_t siglen,
+ const unsigned char *tbs,
+ size_t tbslen));
+
+void EVP_PKEY_meth_get_verify_recover(EVP_PKEY_METHOD *pmeth,
+ int (**pverify_recover_init) (EVP_PKEY_CTX
+ *ctx),
+ int (**pverify_recover) (EVP_PKEY_CTX
+ *ctx,
+ unsigned char
+ *sig,
+ size_t *siglen,
+ const unsigned
+ char *tbs,
+ size_t tbslen));
+
+void EVP_PKEY_meth_get_signctx(EVP_PKEY_METHOD *pmeth,
+ int (**psignctx_init) (EVP_PKEY_CTX *ctx,
+ EVP_MD_CTX *mctx),
+ int (**psignctx) (EVP_PKEY_CTX *ctx,
+ unsigned char *sig,
+ size_t *siglen,
+ EVP_MD_CTX *mctx));
+
+void EVP_PKEY_meth_get_verifyctx(EVP_PKEY_METHOD *pmeth,
+ int (**pverifyctx_init) (EVP_PKEY_CTX *ctx,
+ EVP_MD_CTX *mctx),
+ int (**pverifyctx) (EVP_PKEY_CTX *ctx,
+ const unsigned char *sig,
+ int siglen,
+ EVP_MD_CTX *mctx));
+
+void EVP_PKEY_meth_get_encrypt(EVP_PKEY_METHOD *pmeth,
+ int (**pencrypt_init) (EVP_PKEY_CTX *ctx),
+ int (**pencryptfn) (EVP_PKEY_CTX *ctx,
+ unsigned char *out,
+ size_t *outlen,
+ const unsigned char *in,
+ size_t inlen));
+
+void EVP_PKEY_meth_get_decrypt(EVP_PKEY_METHOD *pmeth,
+ int (**pdecrypt_init) (EVP_PKEY_CTX *ctx),
+ int (**pdecrypt) (EVP_PKEY_CTX *ctx,
+ unsigned char *out,
+ size_t *outlen,
+ const unsigned char *in,
+ size_t inlen));
+
+void EVP_PKEY_meth_get_derive(EVP_PKEY_METHOD *pmeth,
+ int (**pderive_init) (EVP_PKEY_CTX *ctx),
+ int (**pderive) (EVP_PKEY_CTX *ctx,
+ unsigned char *key,
+ size_t *keylen));
+
+void EVP_PKEY_meth_get_ctrl(EVP_PKEY_METHOD *pmeth,
+ int (**pctrl) (EVP_PKEY_CTX *ctx, int type, int p1,
+ void *p2),
+ int (**pctrl_str) (EVP_PKEY_CTX *ctx,
+ const char *type,
+ const char *value));
+
void EVP_add_alg_module(void);
/* BEGIN ERROR CODES */
diff --git a/ext/openssl/windows/x64/include/openssl/opensslv.h b/ext/openssl/windows/x64/include/openssl/opensslv.h
index 825a330a..77f124e2 100644
--- a/ext/openssl/windows/x64/include/openssl/opensslv.h
+++ b/ext/openssl/windows/x64/include/openssl/opensslv.h
@@ -30,11 +30,11 @@ extern "C" {
* (Prior to 0.9.5a beta1, a different scheme was used: MMNNFFRBB for
* major minor fix final patch/beta)
*/
-# define OPENSSL_VERSION_NUMBER 0x100020cfL
+# define OPENSSL_VERSION_NUMBER 0x100020ffL
# ifdef OPENSSL_FIPS
-# define OPENSSL_VERSION_TEXT "OpenSSL 1.0.2l-fips 25 May 2017"
+# define OPENSSL_VERSION_TEXT "OpenSSL 1.0.2o-fips 27 Mar 2018"
# else
-# define OPENSSL_VERSION_TEXT "OpenSSL 1.0.2l 25 May 2017"
+# define OPENSSL_VERSION_TEXT "OpenSSL 1.0.2o 27 Mar 2018"
# endif
# define OPENSSL_VERSION_PTEXT " part of " OPENSSL_VERSION_TEXT
diff --git a/ext/openssl/windows/x64/include/openssl/ssl.h b/ext/openssl/windows/x64/include/openssl/ssl.h
index 90aeb0ce..3cf96a23 100644
--- a/ext/openssl/windows/x64/include/openssl/ssl.h
+++ b/ext/openssl/windows/x64/include/openssl/ssl.h
@@ -1727,7 +1727,7 @@ extern "C" {
# define SSL_ST_BEFORE 0x4000
# define SSL_ST_OK 0x03
# define SSL_ST_RENEGOTIATE (0x04|SSL_ST_INIT)
-# define SSL_ST_ERR 0x05
+# define SSL_ST_ERR (0x05|SSL_ST_INIT)
# define SSL_CB_LOOP 0x01
# define SSL_CB_EXIT 0x02
diff --git a/ext/openssl/windows/x64/include/openssl/symhacks.h b/ext/openssl/windows/x64/include/openssl/symhacks.h
index 239fa4fb..30019579 100644
--- a/ext/openssl/windows/x64/include/openssl/symhacks.h
+++ b/ext/openssl/windows/x64/include/openssl/symhacks.h
@@ -280,6 +280,8 @@
# define OPENSSL_add_all_algorithms_conf OPENSSL_add_all_algo_conf
# undef EVP_PKEY_meth_set_verify_recover
# define EVP_PKEY_meth_set_verify_recover EVP_PKEY_meth_set_vrfy_recover
+# undef EVP_PKEY_meth_get_verify_recover
+# define EVP_PKEY_meth_get_verify_recover EVP_PKEY_meth_get_vrfy_recover
/* Hack some long EC names */
# undef EC_GROUP_set_point_conversion_form
diff --git a/ext/openssl/windows/x64/include/openssl/tls1.h b/ext/openssl/windows/x64/include/openssl/tls1.h
index 7e237d06..dd1d8c10 100644
--- a/ext/openssl/windows/x64/include/openssl/tls1.h
+++ b/ext/openssl/windows/x64/include/openssl/tls1.h
@@ -317,7 +317,7 @@ int SSL_get_servername_type(const SSL *s);
*/
int SSL_export_keying_material(SSL *s, unsigned char *out, size_t olen,
const char *label, size_t llen,
- const unsigned char *p, size_t plen,
+ const unsigned char *context, size_t contextlen,
int use_context);
int SSL_get_sigalgs(SSL *s, int idx,
diff --git a/ext/openssl/windows/x64/lib/engines/4758cca.dll b/ext/openssl/windows/x64/lib/engines/4758cca.dll
index 0df3784a..7b678fd9 100644
Binary files a/ext/openssl/windows/x64/lib/engines/4758cca.dll and b/ext/openssl/windows/x64/lib/engines/4758cca.dll differ
diff --git a/ext/openssl/windows/x64/lib/engines/aep.dll b/ext/openssl/windows/x64/lib/engines/aep.dll
index 95757767..616204c4 100644
Binary files a/ext/openssl/windows/x64/lib/engines/aep.dll and b/ext/openssl/windows/x64/lib/engines/aep.dll differ
diff --git a/ext/openssl/windows/x64/lib/engines/atalla.dll b/ext/openssl/windows/x64/lib/engines/atalla.dll
index 98899cdf..0aad54cd 100644
Binary files a/ext/openssl/windows/x64/lib/engines/atalla.dll and b/ext/openssl/windows/x64/lib/engines/atalla.dll differ
diff --git a/ext/openssl/windows/x64/lib/engines/capi.dll b/ext/openssl/windows/x64/lib/engines/capi.dll
index f618149d..d76f9d7b 100644
Binary files a/ext/openssl/windows/x64/lib/engines/capi.dll and b/ext/openssl/windows/x64/lib/engines/capi.dll differ
diff --git a/ext/openssl/windows/x64/lib/engines/chil.dll b/ext/openssl/windows/x64/lib/engines/chil.dll
index 0731de35..b9914c77 100644
Binary files a/ext/openssl/windows/x64/lib/engines/chil.dll and b/ext/openssl/windows/x64/lib/engines/chil.dll differ
diff --git a/ext/openssl/windows/x64/lib/engines/cswift.dll b/ext/openssl/windows/x64/lib/engines/cswift.dll
index e37bc735..5d6dc83b 100644
Binary files a/ext/openssl/windows/x64/lib/engines/cswift.dll and b/ext/openssl/windows/x64/lib/engines/cswift.dll differ
diff --git a/ext/openssl/windows/x64/lib/engines/gmp.dll b/ext/openssl/windows/x64/lib/engines/gmp.dll
index fa090ef2..199bef34 100644
Binary files a/ext/openssl/windows/x64/lib/engines/gmp.dll and b/ext/openssl/windows/x64/lib/engines/gmp.dll differ
diff --git a/ext/openssl/windows/x64/lib/engines/gost.dll b/ext/openssl/windows/x64/lib/engines/gost.dll
index 867f97a2..29ab5be7 100644
Binary files a/ext/openssl/windows/x64/lib/engines/gost.dll and b/ext/openssl/windows/x64/lib/engines/gost.dll differ
diff --git a/ext/openssl/windows/x64/lib/engines/nuron.dll b/ext/openssl/windows/x64/lib/engines/nuron.dll
index 187c2853..a0cd8ceb 100644
Binary files a/ext/openssl/windows/x64/lib/engines/nuron.dll and b/ext/openssl/windows/x64/lib/engines/nuron.dll differ
diff --git a/ext/openssl/windows/x64/lib/engines/padlock.dll b/ext/openssl/windows/x64/lib/engines/padlock.dll
index 0adfb57c..455a98aa 100644
Binary files a/ext/openssl/windows/x64/lib/engines/padlock.dll and b/ext/openssl/windows/x64/lib/engines/padlock.dll differ
diff --git a/ext/openssl/windows/x64/lib/engines/sureware.dll b/ext/openssl/windows/x64/lib/engines/sureware.dll
index f66ce688..29b52ade 100644
Binary files a/ext/openssl/windows/x64/lib/engines/sureware.dll and b/ext/openssl/windows/x64/lib/engines/sureware.dll differ
diff --git a/ext/openssl/windows/x64/lib/engines/ubsec.dll b/ext/openssl/windows/x64/lib/engines/ubsec.dll
index 095462c9..3d8e4a4e 100644
Binary files a/ext/openssl/windows/x64/lib/engines/ubsec.dll and b/ext/openssl/windows/x64/lib/engines/ubsec.dll differ
diff --git a/ext/openssl/windows/x64/lib/libeay32.lib b/ext/openssl/windows/x64/lib/libeay32.lib
index c786d549..9eecfc06 100644
Binary files a/ext/openssl/windows/x64/lib/libeay32.lib and b/ext/openssl/windows/x64/lib/libeay32.lib differ
diff --git a/ext/openssl/windows/x64/lib/ssleay32.lib b/ext/openssl/windows/x64/lib/ssleay32.lib
index f93da7e0..360420b2 100644
Binary files a/ext/openssl/windows/x64/lib/ssleay32.lib and b/ext/openssl/windows/x64/lib/ssleay32.lib differ
diff --git a/ext/openssl/windows/x86/bin/libeay32.dll b/ext/openssl/windows/x86/bin/libeay32.dll
index 7f89690d..a2669244 100644
Binary files a/ext/openssl/windows/x86/bin/libeay32.dll and b/ext/openssl/windows/x86/bin/libeay32.dll differ
diff --git a/ext/openssl/windows/x86/bin/openssl.exe b/ext/openssl/windows/x86/bin/openssl.exe
index e99c4ec4..926b05d7 100644
Binary files a/ext/openssl/windows/x86/bin/openssl.exe and b/ext/openssl/windows/x86/bin/openssl.exe differ
diff --git a/ext/openssl/windows/x86/bin/ssleay32.dll b/ext/openssl/windows/x86/bin/ssleay32.dll
index 5b86b877..7224eca6 100644
Binary files a/ext/openssl/windows/x86/bin/ssleay32.dll and b/ext/openssl/windows/x86/bin/ssleay32.dll differ
diff --git a/ext/openssl/windows/x86/include/openssl/asn1.h b/ext/openssl/windows/x86/include/openssl/asn1.h
index 68e791fc..35a2b2aa 100644
--- a/ext/openssl/windows/x86/include/openssl/asn1.h
+++ b/ext/openssl/windows/x86/include/openssl/asn1.h
@@ -1365,6 +1365,7 @@ void ERR_load_ASN1_strings(void);
# define ASN1_R_MSTRING_NOT_UNIVERSAL 139
# define ASN1_R_MSTRING_WRONG_TAG 140
# define ASN1_R_NESTED_ASN1_STRING 197
+# define ASN1_R_NESTED_TOO_DEEP 219
# define ASN1_R_NON_HEX_CHARACTERS 141
# define ASN1_R_NOT_ASCII_FORMAT 190
# define ASN1_R_NOT_ENOUGH_DATA 142
diff --git a/ext/openssl/windows/x86/include/openssl/dh.h b/ext/openssl/windows/x86/include/openssl/dh.h
index a228c7a7..80b28fb3 100644
--- a/ext/openssl/windows/x86/include/openssl/dh.h
+++ b/ext/openssl/windows/x86/include/openssl/dh.h
@@ -257,11 +257,13 @@ DH *DH_get_1024_160(void);
DH *DH_get_2048_224(void);
DH *DH_get_2048_256(void);
+# ifndef OPENSSL_NO_CMS
/* RFC2631 KDF */
int DH_KDF_X9_42(unsigned char *out, size_t outlen,
const unsigned char *Z, size_t Zlen,
ASN1_OBJECT *key_oid,
const unsigned char *ukm, size_t ukmlen, const EVP_MD *md);
+# endif
# define EVP_PKEY_CTX_set_dh_paramgen_prime_len(ctx, len) \
EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN, \
diff --git a/ext/openssl/windows/x86/include/openssl/evp.h b/ext/openssl/windows/x86/include/openssl/evp.h
index d258ef87..cf1de15e 100644
--- a/ext/openssl/windows/x86/include/openssl/evp.h
+++ b/ext/openssl/windows/x86/include/openssl/evp.h
@@ -1363,6 +1363,98 @@ void EVP_PKEY_meth_set_ctrl(EVP_PKEY_METHOD *pmeth,
const char *type,
const char *value));
+void EVP_PKEY_meth_get_init(EVP_PKEY_METHOD *pmeth,
+ int (**pinit) (EVP_PKEY_CTX *ctx));
+
+void EVP_PKEY_meth_get_copy(EVP_PKEY_METHOD *pmeth,
+ int (**pcopy) (EVP_PKEY_CTX *dst,
+ EVP_PKEY_CTX *src));
+
+void EVP_PKEY_meth_get_cleanup(EVP_PKEY_METHOD *pmeth,
+ void (**pcleanup) (EVP_PKEY_CTX *ctx));
+
+void EVP_PKEY_meth_get_paramgen(EVP_PKEY_METHOD *pmeth,
+ int (**pparamgen_init) (EVP_PKEY_CTX *ctx),
+ int (**pparamgen) (EVP_PKEY_CTX *ctx,
+ EVP_PKEY *pkey));
+
+void EVP_PKEY_meth_get_keygen(EVP_PKEY_METHOD *pmeth,
+ int (**pkeygen_init) (EVP_PKEY_CTX *ctx),
+ int (**pkeygen) (EVP_PKEY_CTX *ctx,
+ EVP_PKEY *pkey));
+
+void EVP_PKEY_meth_get_sign(EVP_PKEY_METHOD *pmeth,
+ int (**psign_init) (EVP_PKEY_CTX *ctx),
+ int (**psign) (EVP_PKEY_CTX *ctx,
+ unsigned char *sig, size_t *siglen,
+ const unsigned char *tbs,
+ size_t tbslen));
+
+void EVP_PKEY_meth_get_verify(EVP_PKEY_METHOD *pmeth,
+ int (**pverify_init) (EVP_PKEY_CTX *ctx),
+ int (**pverify) (EVP_PKEY_CTX *ctx,
+ const unsigned char *sig,
+ size_t siglen,
+ const unsigned char *tbs,
+ size_t tbslen));
+
+void EVP_PKEY_meth_get_verify_recover(EVP_PKEY_METHOD *pmeth,
+ int (**pverify_recover_init) (EVP_PKEY_CTX
+ *ctx),
+ int (**pverify_recover) (EVP_PKEY_CTX
+ *ctx,
+ unsigned char
+ *sig,
+ size_t *siglen,
+ const unsigned
+ char *tbs,
+ size_t tbslen));
+
+void EVP_PKEY_meth_get_signctx(EVP_PKEY_METHOD *pmeth,
+ int (**psignctx_init) (EVP_PKEY_CTX *ctx,
+ EVP_MD_CTX *mctx),
+ int (**psignctx) (EVP_PKEY_CTX *ctx,
+ unsigned char *sig,
+ size_t *siglen,
+ EVP_MD_CTX *mctx));
+
+void EVP_PKEY_meth_get_verifyctx(EVP_PKEY_METHOD *pmeth,
+ int (**pverifyctx_init) (EVP_PKEY_CTX *ctx,
+ EVP_MD_CTX *mctx),
+ int (**pverifyctx) (EVP_PKEY_CTX *ctx,
+ const unsigned char *sig,
+ int siglen,
+ EVP_MD_CTX *mctx));
+
+void EVP_PKEY_meth_get_encrypt(EVP_PKEY_METHOD *pmeth,
+ int (**pencrypt_init) (EVP_PKEY_CTX *ctx),
+ int (**pencryptfn) (EVP_PKEY_CTX *ctx,
+ unsigned char *out,
+ size_t *outlen,
+ const unsigned char *in,
+ size_t inlen));
+
+void EVP_PKEY_meth_get_decrypt(EVP_PKEY_METHOD *pmeth,
+ int (**pdecrypt_init) (EVP_PKEY_CTX *ctx),
+ int (**pdecrypt) (EVP_PKEY_CTX *ctx,
+ unsigned char *out,
+ size_t *outlen,
+ const unsigned char *in,
+ size_t inlen));
+
+void EVP_PKEY_meth_get_derive(EVP_PKEY_METHOD *pmeth,
+ int (**pderive_init) (EVP_PKEY_CTX *ctx),
+ int (**pderive) (EVP_PKEY_CTX *ctx,
+ unsigned char *key,
+ size_t *keylen));
+
+void EVP_PKEY_meth_get_ctrl(EVP_PKEY_METHOD *pmeth,
+ int (**pctrl) (EVP_PKEY_CTX *ctx, int type, int p1,
+ void *p2),
+ int (**pctrl_str) (EVP_PKEY_CTX *ctx,
+ const char *type,
+ const char *value));
+
void EVP_add_alg_module(void);
/* BEGIN ERROR CODES */
diff --git a/ext/openssl/windows/x86/include/openssl/opensslv.h b/ext/openssl/windows/x86/include/openssl/opensslv.h
index 825a330a..77f124e2 100644
--- a/ext/openssl/windows/x86/include/openssl/opensslv.h
+++ b/ext/openssl/windows/x86/include/openssl/opensslv.h
@@ -30,11 +30,11 @@ extern "C" {
* (Prior to 0.9.5a beta1, a different scheme was used: MMNNFFRBB for
* major minor fix final patch/beta)
*/
-# define OPENSSL_VERSION_NUMBER 0x100020cfL
+# define OPENSSL_VERSION_NUMBER 0x100020ffL
# ifdef OPENSSL_FIPS
-# define OPENSSL_VERSION_TEXT "OpenSSL 1.0.2l-fips 25 May 2017"
+# define OPENSSL_VERSION_TEXT "OpenSSL 1.0.2o-fips 27 Mar 2018"
# else
-# define OPENSSL_VERSION_TEXT "OpenSSL 1.0.2l 25 May 2017"
+# define OPENSSL_VERSION_TEXT "OpenSSL 1.0.2o 27 Mar 2018"
# endif
# define OPENSSL_VERSION_PTEXT " part of " OPENSSL_VERSION_TEXT
diff --git a/ext/openssl/windows/x86/include/openssl/ssl.h b/ext/openssl/windows/x86/include/openssl/ssl.h
index 90aeb0ce..3cf96a23 100644
--- a/ext/openssl/windows/x86/include/openssl/ssl.h
+++ b/ext/openssl/windows/x86/include/openssl/ssl.h
@@ -1727,7 +1727,7 @@ extern "C" {
# define SSL_ST_BEFORE 0x4000
# define SSL_ST_OK 0x03
# define SSL_ST_RENEGOTIATE (0x04|SSL_ST_INIT)
-# define SSL_ST_ERR 0x05
+# define SSL_ST_ERR (0x05|SSL_ST_INIT)
# define SSL_CB_LOOP 0x01
# define SSL_CB_EXIT 0x02
diff --git a/ext/openssl/windows/x86/include/openssl/symhacks.h b/ext/openssl/windows/x86/include/openssl/symhacks.h
index 239fa4fb..30019579 100644
--- a/ext/openssl/windows/x86/include/openssl/symhacks.h
+++ b/ext/openssl/windows/x86/include/openssl/symhacks.h
@@ -280,6 +280,8 @@
# define OPENSSL_add_all_algorithms_conf OPENSSL_add_all_algo_conf
# undef EVP_PKEY_meth_set_verify_recover
# define EVP_PKEY_meth_set_verify_recover EVP_PKEY_meth_set_vrfy_recover
+# undef EVP_PKEY_meth_get_verify_recover
+# define EVP_PKEY_meth_get_verify_recover EVP_PKEY_meth_get_vrfy_recover
/* Hack some long EC names */
# undef EC_GROUP_set_point_conversion_form
diff --git a/ext/openssl/windows/x86/include/openssl/tls1.h b/ext/openssl/windows/x86/include/openssl/tls1.h
index 7e237d06..dd1d8c10 100644
--- a/ext/openssl/windows/x86/include/openssl/tls1.h
+++ b/ext/openssl/windows/x86/include/openssl/tls1.h
@@ -317,7 +317,7 @@ int SSL_get_servername_type(const SSL *s);
*/
int SSL_export_keying_material(SSL *s, unsigned char *out, size_t olen,
const char *label, size_t llen,
- const unsigned char *p, size_t plen,
+ const unsigned char *context, size_t contextlen,
int use_context);
int SSL_get_sigalgs(SSL *s, int idx,
diff --git a/ext/openssl/windows/x86/lib/engines/4758cca.dll b/ext/openssl/windows/x86/lib/engines/4758cca.dll
index 1540ccdf..cc476456 100644
Binary files a/ext/openssl/windows/x86/lib/engines/4758cca.dll and b/ext/openssl/windows/x86/lib/engines/4758cca.dll differ
diff --git a/ext/openssl/windows/x86/lib/engines/aep.dll b/ext/openssl/windows/x86/lib/engines/aep.dll
index 85b31c76..59e0cf37 100644
Binary files a/ext/openssl/windows/x86/lib/engines/aep.dll and b/ext/openssl/windows/x86/lib/engines/aep.dll differ
diff --git a/ext/openssl/windows/x86/lib/engines/atalla.dll b/ext/openssl/windows/x86/lib/engines/atalla.dll
index 6511cffc..30726735 100644
Binary files a/ext/openssl/windows/x86/lib/engines/atalla.dll and b/ext/openssl/windows/x86/lib/engines/atalla.dll differ
diff --git a/ext/openssl/windows/x86/lib/engines/capi.dll b/ext/openssl/windows/x86/lib/engines/capi.dll
index d60138b1..775612a1 100644
Binary files a/ext/openssl/windows/x86/lib/engines/capi.dll and b/ext/openssl/windows/x86/lib/engines/capi.dll differ
diff --git a/ext/openssl/windows/x86/lib/engines/chil.dll b/ext/openssl/windows/x86/lib/engines/chil.dll
index 5449c966..79a37cc6 100644
Binary files a/ext/openssl/windows/x86/lib/engines/chil.dll and b/ext/openssl/windows/x86/lib/engines/chil.dll differ
diff --git a/ext/openssl/windows/x86/lib/engines/cswift.dll b/ext/openssl/windows/x86/lib/engines/cswift.dll
index 030e0bd5..ffa3d39d 100644
Binary files a/ext/openssl/windows/x86/lib/engines/cswift.dll and b/ext/openssl/windows/x86/lib/engines/cswift.dll differ
diff --git a/ext/openssl/windows/x86/lib/engines/gmp.dll b/ext/openssl/windows/x86/lib/engines/gmp.dll
index 9992b7b1..98ae5061 100644
Binary files a/ext/openssl/windows/x86/lib/engines/gmp.dll and b/ext/openssl/windows/x86/lib/engines/gmp.dll differ
diff --git a/ext/openssl/windows/x86/lib/engines/gost.dll b/ext/openssl/windows/x86/lib/engines/gost.dll
index 0e6ffaa6..6f9e1c28 100644
Binary files a/ext/openssl/windows/x86/lib/engines/gost.dll and b/ext/openssl/windows/x86/lib/engines/gost.dll differ
diff --git a/ext/openssl/windows/x86/lib/engines/nuron.dll b/ext/openssl/windows/x86/lib/engines/nuron.dll
index e63d35be..9f1acf36 100644
Binary files a/ext/openssl/windows/x86/lib/engines/nuron.dll and b/ext/openssl/windows/x86/lib/engines/nuron.dll differ
diff --git a/ext/openssl/windows/x86/lib/engines/padlock.dll b/ext/openssl/windows/x86/lib/engines/padlock.dll
index 54aacd24..e8612a3c 100644
Binary files a/ext/openssl/windows/x86/lib/engines/padlock.dll and b/ext/openssl/windows/x86/lib/engines/padlock.dll differ
diff --git a/ext/openssl/windows/x86/lib/engines/sureware.dll b/ext/openssl/windows/x86/lib/engines/sureware.dll
index f55625a2..987bbdff 100644
Binary files a/ext/openssl/windows/x86/lib/engines/sureware.dll and b/ext/openssl/windows/x86/lib/engines/sureware.dll differ
diff --git a/ext/openssl/windows/x86/lib/engines/ubsec.dll b/ext/openssl/windows/x86/lib/engines/ubsec.dll
index 18e59573..7872a832 100644
Binary files a/ext/openssl/windows/x86/lib/engines/ubsec.dll and b/ext/openssl/windows/x86/lib/engines/ubsec.dll differ
diff --git a/ext/openssl/windows/x86/lib/libeay32.lib b/ext/openssl/windows/x86/lib/libeay32.lib
index adb0edd5..7ffa761c 100644
Binary files a/ext/openssl/windows/x86/lib/libeay32.lib and b/ext/openssl/windows/x86/lib/libeay32.lib differ
diff --git a/ext/openssl/windows/x86/lib/ssleay32.lib b/ext/openssl/windows/x86/lib/ssleay32.lib
index 3128e77c..18bab9fb 100644
Binary files a/ext/openssl/windows/x86/lib/ssleay32.lib and b/ext/openssl/windows/x86/lib/ssleay32.lib differ
diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt
index afb80c07..54cafabc 100644
--- a/src/gui/CMakeLists.txt
+++ b/src/gui/CMakeLists.txt
@@ -25,9 +25,16 @@ target_link_libraries (synergy shared)
if (WIN32)
include_directories ($ENV{BONJOUR_SDK_HOME}/Include)
- find_library (DNSSD_LIB dnssd.lib
+ if (CMAKE_SIZEOF_VOID_P EQUAL 8)
+ find_library (DNSSD_LIB dnssd.lib
HINTS ENV BONJOUR_SDK_HOME
PATH_SUFFIXES "Lib/x64")
+ else()
+ find_library (DNSSD_LIB dnssd.lib
+ HINTS ENV BONJOUR_SDK_HOME
+ PATH_SUFFIXES "Lib/Win32")
+ endif()
+
elseif (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
target_link_libraries (synergy dns_sd)
endif()
diff --git a/src/lib/arch/IArchNetwork.h b/src/lib/arch/IArchNetwork.h
index d71f8d88..0d58dc85 100644
--- a/src/lib/arch/IArchNetwork.h
+++ b/src/lib/arch/IArchNetwork.h
@@ -64,6 +64,7 @@ public:
enum EAddressFamily {
kUNKNOWN,
kINET,
+ kINET6,
};
//! Supported socket types
diff --git a/src/lib/arch/unix/ArchNetworkBSD.cpp b/src/lib/arch/unix/ArchNetworkBSD.cpp
index 5c80a7ad..14b57882 100644
--- a/src/lib/arch/unix/ArchNetworkBSD.cpp
+++ b/src/lib/arch/unix/ArchNetworkBSD.cpp
@@ -18,22 +18,22 @@
#include "arch/unix/ArchNetworkBSD.h"
+#include "arch/Arch.h"
#include "arch/unix/ArchMultithreadPosix.h"
#include "arch/unix/XArchUnix.h"
-#include "arch/Arch.h"
#if HAVE_UNISTD_H
# include
#endif
-#include
#include
+#include
#if !defined(TCP_NODELAY)
# include
#endif
#include
-#include
#include
-#include
+#include
+#include
#if HAVE_POLL
# include
@@ -52,7 +52,8 @@
static const int s_family[] = {
PF_UNSPEC,
- PF_INET
+ PF_INET,
+ PF_INET6,
};
static const int s_type[] = {
SOCK_DGRAM,
@@ -87,8 +88,7 @@ inet_aton(const char* cp, struct in_addr* inp)
//
ArchNetworkBSD::ArchNetworkBSD()
-{
-}
+= default;
ArchNetworkBSD::~ArchNetworkBSD()
{
@@ -119,7 +119,7 @@ ArchNetworkBSD::newSocket(EAddressFamily family, ESocketType type)
}
// allocate socket object
- ArchSocketImpl* newSocket = new ArchSocketImpl;
+ auto* newSocket = new ArchSocketImpl;
newSocket->m_fd = fd;
newSocket->m_refCount = 1;
return newSocket;
@@ -191,7 +191,7 @@ ArchNetworkBSD::bindSocket(ArchSocket s, ArchNetAddress addr)
assert(s != NULL);
assert(addr != NULL);
- if (bind(s->m_fd, &addr->m_addr, addr->m_len) == -1) {
+ if (bind(s->m_fd, TYPED_ADDR(struct sockaddr, addr), addr->m_len) == -1) {
throwError(errno);
}
}
@@ -214,25 +214,25 @@ ArchNetworkBSD::acceptSocket(ArchSocket s, ArchNetAddress* addr)
// if user passed NULL in addr then use scratch space
ArchNetAddress dummy;
- if (addr == NULL) {
+ if (addr == nullptr) {
addr = &dummy;
}
// create new socket and address
- ArchSocketImpl* newSocket = new ArchSocketImpl;
+ auto* newSocket = new ArchSocketImpl;
*addr = new ArchNetAddressImpl;
// accept on socket
- ACCEPT_TYPE_ARG3 len = (ACCEPT_TYPE_ARG3)((*addr)->m_len);
- int fd = accept(s->m_fd, &(*addr)->m_addr, &len);
- (*addr)->m_len = (socklen_t)len;
+ auto len = ((*addr)->m_len);
+ int fd = accept(s->m_fd, TYPED_ADDR(struct sockaddr, (*addr)), &len);
+ (*addr)->m_len = len;
if (fd == -1) {
int err = errno;
delete newSocket;
delete *addr;
- *addr = NULL;
+ *addr = nullptr;
if (err == EAGAIN) {
- return NULL;
+ return nullptr;
}
throwError(err);
}
@@ -244,7 +244,7 @@ ArchNetworkBSD::acceptSocket(ArchSocket s, ArchNetAddress* addr)
close(fd);
delete newSocket;
delete *addr;
- *addr = NULL;
+ *addr = nullptr;
throw;
}
@@ -266,7 +266,7 @@ ArchNetworkBSD::connectSocket(ArchSocket s, ArchNetAddress addr)
assert(s != NULL);
assert(addr != NULL);
- if (connect(s->m_fd, &addr->m_addr, addr->m_len) == -1) {
+ if (connect(s->m_fd, TYPED_ADDR(struct sockaddr, addr), addr->m_len) == -1) {
if (errno == EISCONN) {
return true;
}
@@ -294,11 +294,11 @@ ArchNetworkBSD::pollSocket(PollEntry pe[], int num, double timeout)
}
// allocate space for translated query
- struct pollfd* pfd = new struct pollfd[1 + num];
+ auto* pfd = new struct pollfd[1 + num];
// translate query
for (int i = 0; i < num; ++i) {
- pfd[i].fd = (pe[i].m_socket == NULL) ? -1 : pe[i].m_socket->m_fd;
+ pfd[i].fd = (pe[i].m_socket == nullptr) ? -1 : pe[i].m_socket->m_fd;
pfd[i].events = 0;
if ((pe[i].m_events & kPOLLIN) != 0) {
pfd[i].events |= POLLIN;
@@ -311,7 +311,7 @@ ArchNetworkBSD::pollSocket(PollEntry pe[], int num, double timeout)
// add the unblock pipe
const int* unblockPipe = getUnblockPipe();
- if (unblockPipe != NULL) {
+ if (unblockPipe != nullptr) {
pfd[n].fd = unblockPipe[0];
pfd[n].events = POLLIN;
++n;
@@ -324,7 +324,7 @@ ArchNetworkBSD::pollSocket(PollEntry pe[], int num, double timeout)
n = poll(pfd, n, t);
// reset the unblock pipe
- if (n > 0 && unblockPipe != NULL && (pfd[num].revents & POLLIN) != 0) {
+ if (n > 0 && unblockPipe != nullptr && (pfd[num].revents & POLLIN) != 0) {
// the unblock event was signalled. flush the pipe.
char dummy[100];
int ignore;
@@ -500,7 +500,7 @@ void
ArchNetworkBSD::unblockPollSocket(ArchThread thread)
{
const int* unblockPipe = getUnblockPipeForThread(thread);
- if (unblockPipe != NULL) {
+ if (unblockPipe != nullptr) {
char dummy = 0;
int ignore;
@@ -545,9 +545,9 @@ ArchNetworkBSD::throwErrorOnSocket(ArchSocket s)
// get the error from the socket layer
int err = 0;
- socklen_t size = (socklen_t)sizeof(err);
+ auto size = static_cast(sizeof(err));
if (getsockopt(s->m_fd, SOL_SOCKET, SO_ERROR,
- (optval_t*)&err, &size) == -1) {
+ reinterpret_cast(&err), &size) == -1) {
err = errno;
}
@@ -584,16 +584,16 @@ ArchNetworkBSD::setNoDelayOnSocket(ArchSocket s, bool noDelay)
// get old state
int oflag;
- socklen_t size = (socklen_t)sizeof(oflag);
+ auto size = static_cast(sizeof(oflag));
if (getsockopt(s->m_fd, IPPROTO_TCP, TCP_NODELAY,
- (optval_t*)&oflag, &size) == -1) {
+ reinterpret_cast(&oflag), &size) == -1) {
throwError(errno);
}
int flag = noDelay ? 1 : 0;
- size = (socklen_t)sizeof(flag);
+ size = static_cast(sizeof(flag));
if (setsockopt(s->m_fd, IPPROTO_TCP, TCP_NODELAY,
- (optval_t*)&flag, size) == -1) {
+ reinterpret_cast(&flag), size) == -1) {
throwError(errno);
}
@@ -607,16 +607,16 @@ ArchNetworkBSD::setReuseAddrOnSocket(ArchSocket s, bool reuse)
// get old state
int oflag;
- socklen_t size = (socklen_t)sizeof(oflag);
+ auto size = static_cast(sizeof(oflag));
if (getsockopt(s->m_fd, SOL_SOCKET, SO_REUSEADDR,
- (optval_t*)&oflag, &size) == -1) {
+ reinterpret_cast(&oflag), &size) == -1) {
throwError(errno);
}
int flag = reuse ? 1 : 0;
- size = (socklen_t)sizeof(flag);
+ size = static_cast(sizeof(flag));
if (setsockopt(s->m_fd, SOL_SOCKET, SO_REUSEADDR,
- (optval_t*)&flag, size) == -1) {
+ reinterpret_cast(&flag), size) == -1) {
throwError(errno);
}
@@ -640,20 +640,27 @@ ArchNetAddress
ArchNetworkBSD::newAnyAddr(EAddressFamily family)
{
// allocate address
- ArchNetAddressImpl* addr = new ArchNetAddressImpl;
+ auto* addr = new ArchNetAddressImpl;
// fill it in
switch (family) {
case kINET: {
- struct sockaddr_in* ipAddr =
- reinterpret_cast(&addr->m_addr);
+ auto* ipAddr = TYPED_ADDR(struct sockaddr_in, addr);
ipAddr->sin_family = AF_INET;
ipAddr->sin_port = 0;
ipAddr->sin_addr.s_addr = INADDR_ANY;
- addr->m_len = (socklen_t)sizeof(struct sockaddr_in);
+ addr->m_len = static_cast(sizeof(struct sockaddr_in));
break;
}
+ case kINET6: {
+ struct sockaddr_in6* ipAddr = TYPED_ADDR(struct sockaddr_in6, addr);
+ ipAddr->sin6_family = AF_INET6;
+ ipAddr->sin6_port = 0;
+ memcpy(&ipAddr->sin6_addr, &in6addr_any, sizeof(in6addr_any));
+ addr->m_len = (socklen_t)sizeof(struct sockaddr_in6);
+ break;
+ }
default:
delete addr;
assert(0 && "invalid family");
@@ -675,50 +682,33 @@ ArchNetAddress
ArchNetworkBSD::nameToAddr(const std::string& name)
{
// allocate address
- ArchNetAddressImpl* addr = new ArchNetAddressImpl;
+ auto* addr = new ArchNetAddressImpl;
- // try to convert assuming an IPv4 dot notation address
- struct sockaddr_in inaddr;
- memset(&inaddr, 0, sizeof(inaddr));
- if (inet_aton(name.c_str(), &inaddr.sin_addr) != 0) {
- // it's a dot notation address
- addr->m_len = (socklen_t)sizeof(struct sockaddr_in);
- inaddr.sin_family = AF_INET;
- inaddr.sin_port = 0;
- memcpy(&addr->m_addr, &inaddr, addr->m_len);
- }
+ char ipstr[INET6_ADDRSTRLEN];
+ struct addrinfo hints;
+ struct addrinfo *p;
+ int ret;
- else {
- // mutexed address lookup (ugh)
- ARCH->lockMutex(m_mutex);
- struct hostent* info = gethostbyname(name.c_str());
- if (info == NULL) {
- ARCH->unlockMutex(m_mutex);
- delete addr;
- throwNameError(h_errno);
- }
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = AF_UNSPEC;
- // copy over address (only IPv4 currently supported)
- if (info->h_addrtype == AF_INET) {
- addr->m_len = (socklen_t)sizeof(struct sockaddr_in);
- inaddr.sin_family = info->h_addrtype;
- inaddr.sin_port = 0;
- memcpy(&inaddr.sin_addr, info->h_addr_list[0],
- sizeof(inaddr.sin_addr));
- memcpy(&addr->m_addr, &inaddr, addr->m_len);
- }
- else {
- ARCH->unlockMutex(m_mutex);
- delete addr;
- throw XArchNetworkNameUnsupported(
- "The requested name is valid but "
- "does not have a supported address family");
- }
-
- // done with static buffer
+ // done with static buffer
+ ARCH->lockMutex(m_mutex);
+ if ((ret = getaddrinfo(name.c_str(), NULL, &hints, &p)) != 0) {
ARCH->unlockMutex(m_mutex);
+ delete addr;
+ throwNameError(ret);
}
+ if (p->ai_family == AF_INET) {
+ addr->m_len = (socklen_t)sizeof(struct sockaddr_in);
+ } else {
+ addr->m_len = (socklen_t)sizeof(struct sockaddr_in6);
+ }
+ memcpy(&addr->m_addr, p->ai_addr, addr->m_len);
+ freeaddrinfo(p);
+ ARCH->unlockMutex(m_mutex);
+
return addr;
}
@@ -737,15 +727,16 @@ ArchNetworkBSD::addrToName(ArchNetAddress addr)
// mutexed name lookup (ugh)
ARCH->lockMutex(m_mutex);
- struct hostent* info = gethostbyaddr(&addr->m_addr,
- addr->m_len, addr->m_addr.sa_family);
- if (info == NULL) {
- ARCH->unlockMutex(m_mutex);
- throwNameError(h_errno);
+ char host[1024];
+ char service[20];
+ int ret = getnameinfo(TYPED_ADDR(struct sockaddr, addr), addr->m_len, host, sizeof(host), service, sizeof(service), 0);
+ if (ret != 0) {
+ ARCH->unlockMutex(m_mutex);
+ throwNameError(ret);
}
// save (primary) name
- std::string name = info->h_name;
+ std::string name = host;
// done with static buffer
ARCH->unlockMutex(m_mutex);
@@ -760,14 +751,22 @@ ArchNetworkBSD::addrToString(ArchNetAddress addr)
switch (getAddrFamily(addr)) {
case kINET: {
- struct sockaddr_in* ipAddr =
- reinterpret_cast(&addr->m_addr);
+ auto* ipAddr = TYPED_ADDR(struct sockaddr_in, addr);
ARCH->lockMutex(m_mutex);
std::string s = inet_ntoa(ipAddr->sin_addr);
ARCH->unlockMutex(m_mutex);
return s;
}
+ case kINET6: {
+ char strAddr[INET6_ADDRSTRLEN];
+ struct sockaddr_in6* ipAddr = TYPED_ADDR(struct sockaddr_in6, addr);
+ ARCH->lockMutex(m_mutex);
+ inet_ntop(AF_INET6, &ipAddr->sin6_addr, strAddr, INET6_ADDRSTRLEN);
+ ARCH->unlockMutex(m_mutex);
+ return strAddr;
+ }
+
default:
assert(0 && "unknown address family");
return "";
@@ -779,9 +778,11 @@ ArchNetworkBSD::getAddrFamily(ArchNetAddress addr)
{
assert(addr != NULL);
- switch (addr->m_addr.sa_family) {
+ switch (addr->m_addr.ss_family) {
case AF_INET:
return kINET;
+ case AF_INET6:
+ return kINET6;
default:
return kUNKNOWN;
@@ -795,12 +796,17 @@ ArchNetworkBSD::setAddrPort(ArchNetAddress addr, int port)
switch (getAddrFamily(addr)) {
case kINET: {
- struct sockaddr_in* ipAddr =
- reinterpret_cast(&addr->m_addr);
+ auto* ipAddr = TYPED_ADDR(struct sockaddr_in, addr);
ipAddr->sin_port = htons(port);
break;
}
+ case kINET6: {
+ struct sockaddr_in6* ipAddr = TYPED_ADDR(struct sockaddr_in6, addr);
+ ipAddr->sin6_port = htons(port);
+ break;
+ }
+
default:
assert(0 && "unknown address family");
break;
@@ -814,11 +820,15 @@ ArchNetworkBSD::getAddrPort(ArchNetAddress addr)
switch (getAddrFamily(addr)) {
case kINET: {
- struct sockaddr_in* ipAddr =
- reinterpret_cast(&addr->m_addr);
+ auto* ipAddr = TYPED_ADDR(struct sockaddr_in, addr);
return ntohs(ipAddr->sin_port);
}
+ case kINET6: {
+ struct sockaddr_in6* ipAddr = TYPED_ADDR(struct sockaddr_in6, addr);
+ return ntohs(ipAddr->sin6_port);
+ }
+
default:
assert(0 && "unknown address family");
return 0;
@@ -832,10 +842,15 @@ ArchNetworkBSD::isAnyAddr(ArchNetAddress addr)
switch (getAddrFamily(addr)) {
case kINET: {
- struct sockaddr_in* ipAddr =
- reinterpret_cast(&addr->m_addr);
+ auto* ipAddr = TYPED_ADDR(struct sockaddr_in, addr);
return (ipAddr->sin_addr.s_addr == INADDR_ANY &&
- addr->m_len == (socklen_t)sizeof(struct sockaddr_in));
+ addr->m_len == static_cast(sizeof(struct sockaddr_in)));
+ }
+
+ case kINET6: {
+ struct sockaddr_in6* ipAddr = TYPED_ADDR(struct sockaddr_in6, addr);
+ return (memcmp(&ipAddr->sin6_addr, &in6addr_any, sizeof(in6addr_any)) == 0 &&
+ addr->m_len == (socklen_t)sizeof(struct sockaddr_in6));
}
default:
@@ -865,8 +880,8 @@ const int*
ArchNetworkBSD::getUnblockPipeForThread(ArchThread thread)
{
ArchMultithreadPosix* mt = ArchMultithreadPosix::getInstance();
- int* unblockPipe = (int*)mt->getNetworkDataForThread(thread);
- if (unblockPipe == NULL) {
+ auto* unblockPipe = static_cast(mt->getNetworkDataForThread(thread));
+ if (unblockPipe == nullptr) {
unblockPipe = new int[2];
if (pipe(unblockPipe) != -1) {
try {
@@ -875,12 +890,12 @@ ArchNetworkBSD::getUnblockPipeForThread(ArchThread thread)
}
catch (...) {
delete[] unblockPipe;
- unblockPipe = NULL;
+ unblockPipe = nullptr;
}
}
else {
delete[] unblockPipe;
- unblockPipe = NULL;
+ unblockPipe = nullptr;
}
}
return unblockPipe;
@@ -985,4 +1000,4 @@ ArchNetworkBSD::throwNameError(int err)
default:
throw XArchNetworkName(s_msg[4]);
}
-}
+}
\ No newline at end of file
diff --git a/src/lib/arch/unix/ArchNetworkBSD.h b/src/lib/arch/unix/ArchNetworkBSD.h
index 32a22cfd..a153a976 100644
--- a/src/lib/arch/unix/ArchNetworkBSD.h
+++ b/src/lib/arch/unix/ArchNetworkBSD.h
@@ -38,6 +38,7 @@ typedef int socklen_t;
typedef char optval_t;
#define ARCH_NETWORK ArchNetworkBSD
+#define TYPED_ADDR(type_, addr_) (reinterpret_cast(&addr_->m_addr))
class ArchSocketImpl {
public:
@@ -50,8 +51,8 @@ public:
ArchNetAddressImpl() : m_len(sizeof(m_addr)) { }
public:
- struct sockaddr m_addr;
- socklen_t m_len;
+ struct sockaddr_storage m_addr;
+ socklen_t m_len;
};
//! Berkeley (BSD) sockets implementation of IArchNetwork
diff --git a/src/lib/arch/win32/ArchNetworkWinsock.cpp b/src/lib/arch/win32/ArchNetworkWinsock.cpp
index 65a5b320..64750acc 100644
--- a/src/lib/arch/win32/ArchNetworkWinsock.cpp
+++ b/src/lib/arch/win32/ArchNetworkWinsock.cpp
@@ -26,7 +26,8 @@
static const int s_family[] = {
PF_UNSPEC,
- PF_INET
+ PF_INET,
+ PF_INET6,
};
static const int s_type[] = {
SOCK_DGRAM,
@@ -156,7 +157,7 @@ ArchNetworkWinsock::initModule(HMODULE module)
setfunc(startup, WSAStartup, int(PASCAL FAR*)(WORD, LPWSADATA));
// startup network library
- WORD version = MAKEWORD(2 /*major*/, 0 /*minor*/);
+ WORD version = MAKEWORD(2 /*major*/, 2 /*minor*/);
WSADATA data;
int err = startup(version, &data);
if (data.wVersion != version) {
@@ -212,6 +213,11 @@ ArchNetworkWinsock::newSocket(EAddressFamily family, ESocketType type)
}
try {
setBlockingOnSocket(fd, false);
+ BOOL flag = 0;
+ int size = sizeof(flag);
+ if (setsockopt_winsock(fd, IPPROTO_IPV6, IPV6_V6ONLY, &flag, size) == SOCKET_ERROR) {
+ throwError(getsockerror_winsock());
+ }
}
catch (...) {
close_winsock(fd);
@@ -294,7 +300,7 @@ ArchNetworkWinsock::bindSocket(ArchSocket s, ArchNetAddress addr)
assert(s != NULL);
assert(addr != NULL);
- if (bind_winsock(s->m_socket, &addr->m_addr, addr->m_len) == SOCKET_ERROR) {
+ if (bind_winsock(s->m_socket, TYPED_ADDR(struct sockaddr, addr), addr->m_len) == SOCKET_ERROR) {
throwError(getsockerror_winsock());
}
}
@@ -317,10 +323,10 @@ ArchNetworkWinsock::acceptSocket(ArchSocket s, ArchNetAddress* const addr)
// create new socket and temporary address
ArchSocketImpl* socket = new ArchSocketImpl;
- ArchNetAddress tmp = ArchNetAddressImpl::alloc(sizeof(struct sockaddr));
+ ArchNetAddress tmp = ArchNetAddressImpl::alloc(sizeof(struct sockaddr_in6));
// accept on socket
- SOCKET fd = accept_winsock(s->m_socket, &tmp->m_addr, &tmp->m_len);
+ SOCKET fd = accept_winsock(s->m_socket, TYPED_ADDR(struct sockaddr, tmp), &tmp->m_len);
if (fd == INVALID_SOCKET) {
int err = getsockerror_winsock();
delete socket;
@@ -368,7 +374,7 @@ ArchNetworkWinsock::connectSocket(ArchSocket s, ArchNetAddress addr)
assert(s != NULL);
assert(addr != NULL);
- if (connect_winsock(s->m_socket, &addr->m_addr,
+ if (connect_winsock(s->m_socket, TYPED_ADDR(struct sockaddr, addr),
addr->m_len) == SOCKET_ERROR) {
if (getsockerror_winsock() == WSAEISCONN) {
return true;
@@ -685,6 +691,15 @@ ArchNetworkWinsock::newAnyAddr(EAddressFamily family)
break;
}
+ case kINET6: {
+ addr = ArchNetAddressImpl::alloc(sizeof(struct sockaddr_in6));
+ struct sockaddr_in6* ipAddr = TYPED_ADDR(struct sockaddr_in6, addr);
+ ipAddr->sin6_family = AF_INET6;
+ ipAddr->sin6_port = 0;
+ memcpy(&ipAddr->sin6_addr, &in6addr_any, sizeof(in6addr_any));
+ break;
+ }
+
default:
assert(0 && "invalid family");
}
@@ -705,41 +720,31 @@ ArchNetAddress
ArchNetworkWinsock::nameToAddr(const std::string& name)
{
// allocate address
- ArchNetAddressImpl* addr = NULL;
- // try to convert assuming an IPv4 dot notation address
- struct sockaddr_in inaddr;
- memset(&inaddr, 0, sizeof(inaddr));
- inaddr.sin_family = AF_INET;
- inaddr.sin_port = 0;
- inaddr.sin_addr.s_addr = inet_addr_winsock(name.c_str());
- if (inaddr.sin_addr.s_addr != INADDR_NONE) {
- // it's a dot notation address
- addr = ArchNetAddressImpl::alloc(sizeof(struct sockaddr_in));
- memcpy(TYPED_ADDR(void, addr), &inaddr, addr->m_len);
+ ArchNetAddressImpl* addr = new ArchNetAddressImpl;
+
+ struct addrinfo hints;
+ struct addrinfo *p;
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = AF_UNSPEC;
+ int ret = -1;
+
+ ARCH->lockMutex(m_mutex);
+ if ((ret = getaddrinfo(name.c_str(), NULL, &hints, &p)) != 0) {
+ ARCH->unlockMutex(m_mutex);
+ delete addr;
+ throwNameError(ret);
}
- else {
- // address lookup
- struct hostent* info = gethostbyname_winsock(name.c_str());
- if (info == NULL) {
- throwNameError(getsockerror_winsock());
- }
-
- // copy over address (only IPv4 currently supported)
- if (info->h_addrtype == AF_INET) {
- addr = ArchNetAddressImpl::alloc(sizeof(struct sockaddr_in));
- memcpy(&inaddr.sin_addr, info->h_addr_list[0],
- sizeof(inaddr.sin_addr));
- memcpy(TYPED_ADDR(void, addr), &inaddr, addr->m_len);
- }
- else {
- throw XArchNetworkNameUnsupported(
- "The requested name is valid but "
- "does not have a supported address family");
- }
+ if (p->ai_family == AF_INET) {
+ addr->m_len = (socklen_t)sizeof(struct sockaddr_in);
+ } else {
+ addr->m_len = (socklen_t)sizeof(struct sockaddr_in6);
}
+ memcpy(&addr->m_addr, p->ai_addr, addr->m_len);
+ freeaddrinfo(p);
+ ARCH->unlockMutex(m_mutex);
return addr;
}
@@ -756,16 +761,17 @@ ArchNetworkWinsock::addrToName(ArchNetAddress addr)
{
assert(addr != NULL);
- // name lookup
- struct hostent* info = gethostbyaddr_winsock(
- reinterpret_cast(&addr->m_addr),
- addr->m_len, addr->m_addr.sa_family);
- if (info == NULL) {
- throwNameError(getsockerror_winsock());
+ char host[1024];
+ char service[20];
+ int ret = getnameinfo(TYPED_ADDR(struct sockaddr, addr), addr->m_len, host, sizeof(host), service, sizeof(service), 0);
+
+ if (ret != NULL) {
+ throwNameError(ret);
}
// return (primary) name
- return info->h_name;
+ std::string name = host;
+ return name;
}
std::string
@@ -775,11 +781,17 @@ ArchNetworkWinsock::addrToString(ArchNetAddress addr)
switch (getAddrFamily(addr)) {
case kINET: {
- struct sockaddr_in* ipAddr =
- reinterpret_cast(&addr->m_addr);
+ struct sockaddr_in* ipAddr = TYPED_ADDR(struct sockaddr_in, addr);
return inet_ntoa_winsock(ipAddr->sin_addr);
}
+ case kINET6: {
+ char strAddr[INET6_ADDRSTRLEN];
+ struct sockaddr_in6* ipAddr = TYPED_ADDR(struct sockaddr_in6, addr);
+ inet_ntop(AF_INET6, &ipAddr->sin6_addr, strAddr, INET6_ADDRSTRLEN);
+ return strAddr;
+ }
+
default:
assert(0 && "unknown address family");
return "";
@@ -791,10 +803,13 @@ ArchNetworkWinsock::getAddrFamily(ArchNetAddress addr)
{
assert(addr != NULL);
- switch (addr->m_addr.sa_family) {
+ switch (addr->m_addr.ss_family) {
case AF_INET:
return kINET;
+ case AF_INET6:
+ return kINET6;
+
default:
return kUNKNOWN;
}
@@ -807,9 +822,14 @@ ArchNetworkWinsock::setAddrPort(ArchNetAddress addr, int port)
switch (getAddrFamily(addr)) {
case kINET: {
- struct sockaddr_in* ipAddr =
- reinterpret_cast(&addr->m_addr);
- ipAddr->sin_port = htons_winsock(port);
+ struct sockaddr_in* ipAddr = TYPED_ADDR(struct sockaddr_in, addr);
+ ipAddr->sin_port = htons_winsock(static_cast(port));
+ break;
+ }
+
+ case kINET6: {
+ struct sockaddr_in6* ipAddr = TYPED_ADDR(struct sockaddr_in6, addr);
+ ipAddr->sin6_port = htons_winsock(static_cast(port));
break;
}
@@ -826,11 +846,15 @@ ArchNetworkWinsock::getAddrPort(ArchNetAddress addr)
switch (getAddrFamily(addr)) {
case kINET: {
- struct sockaddr_in* ipAddr =
- reinterpret_cast(&addr->m_addr);
+ struct sockaddr_in* ipAddr = TYPED_ADDR(struct sockaddr_in, addr);
return ntohs_winsock(ipAddr->sin_port);
}
+ case kINET6: {
+ struct sockaddr_in6* ipAddr = TYPED_ADDR(struct sockaddr_in6, addr);
+ return ntohs_winsock(ipAddr->sin6_port);
+ }
+
default:
assert(0 && "unknown address family");
return 0;
@@ -844,12 +868,17 @@ ArchNetworkWinsock::isAnyAddr(ArchNetAddress addr)
switch (getAddrFamily(addr)) {
case kINET: {
- struct sockaddr_in* ipAddr =
- reinterpret_cast(&addr->m_addr);
+ struct sockaddr_in* ipAddr = TYPED_ADDR(struct sockaddr_in, addr);
return (addr->m_len == sizeof(struct sockaddr_in) &&
ipAddr->sin_addr.s_addr == INADDR_ANY);
}
+ case kINET6: {
+ struct sockaddr_in6* ipAddr = TYPED_ADDR(struct sockaddr_in6, addr);
+ return (addr->m_len == sizeof(struct sockaddr_in) &&
+ memcmp(&ipAddr->sin6_addr, &in6addr_any, sizeof(in6addr_any))== 0);
+ }
+
default:
assert(0 && "unknown address family");
return true;
diff --git a/src/lib/arch/win32/ArchNetworkWinsock.h b/src/lib/arch/win32/ArchNetworkWinsock.h
index 4c2e8573..cb60d51f 100644
--- a/src/lib/arch/win32/ArchNetworkWinsock.h
+++ b/src/lib/arch/win32/ArchNetworkWinsock.h
@@ -18,8 +18,11 @@
#pragma once
+#include
// declare no functions in winsock2
+#ifndef INCL_WINSOCK_API_PROTOTYPES
#define INCL_WINSOCK_API_PROTOTYPES 0
+#endif
#define INCL_WINSOCK_API_TYPEDEFS 0
#include "arch/IArchNetwork.h"
@@ -30,6 +33,8 @@
#include
#include
+#pragma comment(lib, "ws2_32.lib")
+
#define ARCH_NETWORK ArchNetworkWinsock
class ArchSocketImpl {
@@ -45,8 +50,8 @@ public:
static ArchNetAddressImpl* alloc(size_t);
public:
- int m_len;
- struct sockaddr m_addr;
+ int m_len;
+ struct sockaddr_storage m_addr;
};
#define ADDR_HDR_SIZE offsetof(ArchNetAddressImpl, m_addr)
#define TYPED_ADDR(type_, addr_) (reinterpret_cast(&addr_->m_addr))
diff --git a/src/lib/client/Client.cpp b/src/lib/client/Client.cpp
index c744ec2b..6b63190d 100644
--- a/src/lib/client/Client.cpp
+++ b/src/lib/client/Client.cpp
@@ -147,7 +147,7 @@ Client::connect()
}
// create the socket
- IDataSocket* socket = m_socketFactory->create(m_useSecureNetwork);
+ IDataSocket* socket = m_socketFactory->create(m_useSecureNetwork, ARCH->getAddrFamily(m_serverAddress.getAddress()));
m_socket = dynamic_cast(socket);
// filter socket messages, including a packetizing filter
diff --git a/src/lib/ipc/IpcServer.cpp b/src/lib/ipc/IpcServer.cpp
index 791595f2..e285a384 100644
--- a/src/lib/ipc/IpcServer.cpp
+++ b/src/lib/ipc/IpcServer.cpp
@@ -54,7 +54,7 @@ IpcServer::IpcServer(IEventQueue* events, SocketMultiplexer* socketMultiplexer,
void
IpcServer::init()
{
- m_socket = new TCPListenSocket(m_events, m_socketMultiplexer);
+ m_socket = new TCPListenSocket(m_events, m_socketMultiplexer, IArchNetwork::EAddressFamily::kINET);
m_clientsMutex = ARCH->newMutex();
m_address.resolve();
diff --git a/src/lib/net/ISocketFactory.h b/src/lib/net/ISocketFactory.h
index 628535db..9ba61685 100644
--- a/src/lib/net/ISocketFactory.h
+++ b/src/lib/net/ISocketFactory.h
@@ -19,6 +19,7 @@
#pragma once
#include "common/IInterface.h"
+#include "arch/IArchNetwork.h"
class IDataSocket;
class IListenSocket;
@@ -34,10 +35,10 @@ public:
//@{
//! Create data socket
- virtual IDataSocket* create(bool secure) const = 0;
+ virtual IDataSocket* create(bool secure, IArchNetwork::EAddressFamily family = IArchNetwork::kINET) const = 0;
//! Create listen socket
- virtual IListenSocket* createListen(bool secure) const = 0;
+ virtual IListenSocket* createListen(bool secure, IArchNetwork::EAddressFamily family = IArchNetwork::kINET) const = 0;
//@}
};
diff --git a/src/lib/net/NetworkAddress.cpp b/src/lib/net/NetworkAddress.cpp
index c0df9805..7e699507 100644
--- a/src/lib/net/NetworkAddress.cpp
+++ b/src/lib/net/NetworkAddress.cpp
@@ -87,7 +87,7 @@ NetworkAddress::NetworkAddress(const String& hostname, int port) :
// notation. in that case we assume it's not a port suffix.
// the user can replace the double colon with zeros to
// disambiguate.
- if ((!doubleColon || dotNotation) || !colonNotation) {
+ if ((!doubleColon || dotNotation) && !colonNotation) {
// parse port from hostname
char* end;
const char* chostname = m_hostname.c_str();
diff --git a/src/lib/net/SecureListenSocket.cpp b/src/lib/net/SecureListenSocket.cpp
index b0b50506..75036298 100644
--- a/src/lib/net/SecureListenSocket.cpp
+++ b/src/lib/net/SecureListenSocket.cpp
@@ -32,8 +32,9 @@ static const char s_certificateFilename[] = { "Synergy.pem" };
SecureListenSocket::SecureListenSocket(
IEventQueue* events,
- SocketMultiplexer* socketMultiplexer) :
- TCPListenSocket(events, socketMultiplexer)
+ SocketMultiplexer* socketMultiplexer,
+ IArchNetwork::EAddressFamily family) :
+ TCPListenSocket(events, socketMultiplexer, family)
{
}
diff --git a/src/lib/net/SecureListenSocket.h b/src/lib/net/SecureListenSocket.h
index 340dba5d..5abf4c51 100644
--- a/src/lib/net/SecureListenSocket.h
+++ b/src/lib/net/SecureListenSocket.h
@@ -27,7 +27,7 @@ class IDataSocket;
class SecureListenSocket : public TCPListenSocket{
public:
SecureListenSocket(IEventQueue* events,
- SocketMultiplexer* socketMultiplexer);
+ SocketMultiplexer* socketMultiplexer, IArchNetwork::EAddressFamily family);
~SecureListenSocket();
// IListenSocket overrides
diff --git a/src/lib/net/SecureSocket.cpp b/src/lib/net/SecureSocket.cpp
index 9dd3a816..c795b33d 100644
--- a/src/lib/net/SecureSocket.cpp
+++ b/src/lib/net/SecureSocket.cpp
@@ -53,18 +53,16 @@ struct Ssl {
SSL* m_ssl;
};
-SecureSocket::SecureSocket(
- IEventQueue* events,
- SocketMultiplexer* socketMultiplexer) :
- TCPSocket(events, socketMultiplexer),
+SecureSocket::SecureSocket(IEventQueue* events,
+ SocketMultiplexer* socketMultiplexer, IArchNetwork::EAddressFamily family) :
+ TCPSocket(events, socketMultiplexer, family),
m_ssl(nullptr),
m_secureReady(false),
m_fatal(false)
{
}
-SecureSocket::SecureSocket(
- IEventQueue* events,
+SecureSocket::SecureSocket(IEventQueue* events,
SocketMultiplexer* socketMultiplexer,
ArchSocket socket) :
TCPSocket(events, socketMultiplexer, socket),
diff --git a/src/lib/net/SecureSocket.h b/src/lib/net/SecureSocket.h
index 2292cd29..43eb732f 100644
--- a/src/lib/net/SecureSocket.h
+++ b/src/lib/net/SecureSocket.h
@@ -32,7 +32,7 @@ A secure socket using SSL.
*/
class SecureSocket : public TCPSocket {
public:
- SecureSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer);
+ SecureSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer, IArchNetwork::EAddressFamily family);
SecureSocket(IEventQueue* events,
SocketMultiplexer* socketMultiplexer,
ArchSocket socket);
diff --git a/src/lib/net/TCPListenSocket.cpp b/src/lib/net/TCPListenSocket.cpp
index 23abed40..707f8fe2 100644
--- a/src/lib/net/TCPListenSocket.cpp
+++ b/src/lib/net/TCPListenSocket.cpp
@@ -34,13 +34,13 @@
// TCPListenSocket
//
-TCPListenSocket::TCPListenSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer) :
+TCPListenSocket::TCPListenSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer, IArchNetwork::EAddressFamily family) :
m_events(events),
m_socketMultiplexer(socketMultiplexer)
{
m_mutex = new Mutex;
try {
- m_socket = ARCH->newSocket(IArchNetwork::kINET, IArchNetwork::kSTREAM);
+ m_socket = ARCH->newSocket(family, IArchNetwork::kSTREAM);
}
catch (XArchNetwork& e) {
throw XSocketCreate(e.what());
diff --git a/src/lib/net/TCPListenSocket.h b/src/lib/net/TCPListenSocket.h
index 4abd752c..0d38eddd 100644
--- a/src/lib/net/TCPListenSocket.h
+++ b/src/lib/net/TCPListenSocket.h
@@ -32,7 +32,7 @@ A listen socket using TCP.
*/
class TCPListenSocket : public IListenSocket {
public:
- TCPListenSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer);
+ TCPListenSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer, IArchNetwork::EAddressFamily family);
virtual ~TCPListenSocket();
// ISocket overrides
diff --git a/src/lib/net/TCPSocket.cpp b/src/lib/net/TCPSocket.cpp
index ff69ab2b..39fce497 100644
--- a/src/lib/net/TCPSocket.cpp
+++ b/src/lib/net/TCPSocket.cpp
@@ -37,7 +37,7 @@
// TCPSocket
//
-TCPSocket::TCPSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer) :
+TCPSocket::TCPSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer, IArchNetwork::EAddressFamily family) :
IDataSocket(events),
m_events(events),
m_mutex(),
@@ -45,7 +45,7 @@ TCPSocket::TCPSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer)
m_socketMultiplexer(socketMultiplexer)
{
try {
- m_socket = ARCH->newSocket(IArchNetwork::kINET, IArchNetwork::kSTREAM);
+ m_socket = ARCH->newSocket(family, IArchNetwork::kSTREAM);
}
catch (XArchNetwork& e) {
throw XSocketCreate(e.what());
diff --git a/src/lib/net/TCPSocket.h b/src/lib/net/TCPSocket.h
index b29aa927..ba02c8a9 100644
--- a/src/lib/net/TCPSocket.h
+++ b/src/lib/net/TCPSocket.h
@@ -36,7 +36,7 @@ A data socket using TCP.
*/
class TCPSocket : public IDataSocket {
public:
- TCPSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer);
+ TCPSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer, IArchNetwork::EAddressFamily family = IArchNetwork::kINET);
TCPSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer, ArchSocket socket);
virtual ~TCPSocket();
diff --git a/src/lib/net/TCPSocketFactory.cpp b/src/lib/net/TCPSocketFactory.cpp
index e8329980..d365101c 100644
--- a/src/lib/net/TCPSocketFactory.cpp
+++ b/src/lib/net/TCPSocketFactory.cpp
@@ -41,27 +41,27 @@ TCPSocketFactory::~TCPSocketFactory()
}
IDataSocket*
-TCPSocketFactory::create(bool secure) const
+TCPSocketFactory::create(bool secure, IArchNetwork::EAddressFamily family) const
{
if (secure) {
- SecureSocket* secureSocket = new SecureSocket(m_events, m_socketMultiplexer);
+ SecureSocket* secureSocket = new SecureSocket(m_events, m_socketMultiplexer, family);
secureSocket->initSsl (false);
return secureSocket;
}
else {
- return new TCPSocket(m_events, m_socketMultiplexer);
+ return new TCPSocket(m_events, m_socketMultiplexer, family);
}
}
IListenSocket*
-TCPSocketFactory::createListen(bool secure) const
+TCPSocketFactory::createListen(bool secure, IArchNetwork::EAddressFamily family) const
{
IListenSocket* socket = NULL;
if (secure) {
- socket = new SecureListenSocket(m_events, m_socketMultiplexer);
+ socket = new SecureListenSocket(m_events, m_socketMultiplexer, family);
}
else {
- socket = new TCPListenSocket(m_events, m_socketMultiplexer);
+ socket = new TCPListenSocket(m_events, m_socketMultiplexer, family);
}
return socket;
diff --git a/src/lib/net/TCPSocketFactory.h b/src/lib/net/TCPSocketFactory.h
index 0b28851e..65c15a6e 100644
--- a/src/lib/net/TCPSocketFactory.h
+++ b/src/lib/net/TCPSocketFactory.h
@@ -19,6 +19,7 @@
#pragma once
#include "net/ISocketFactory.h"
+#include "arch/IArchNetwork.h"
class IEventQueue;
class SocketMultiplexer;
@@ -31,9 +32,9 @@ public:
// ISocketFactory overrides
virtual IDataSocket*
- create(bool secure) const;
+ create(bool secure, IArchNetwork::EAddressFamily family = IArchNetwork::kINET) const;
virtual IListenSocket*
- createListen(bool secure) const;
+ createListen(bool secure, IArchNetwork::EAddressFamily family = IArchNetwork::kINET) const;
private:
IEventQueue* m_events;
diff --git a/src/lib/platform/MSWindowsEventQueueBuffer.cpp b/src/lib/platform/MSWindowsEventQueueBuffer.cpp
index b1203f9a..8cc70a82 100644
--- a/src/lib/platform/MSWindowsEventQueueBuffer.cpp
+++ b/src/lib/platform/MSWindowsEventQueueBuffer.cpp
@@ -62,7 +62,7 @@ MSWindowsEventQueueBuffer::waitForEvent(double timeout)
// MsgWaitForMultipleObjects() will block even if the queue isn't
// empty if the messages in the queue were there before the last
// call to GetMessage()/PeekMessage().
- if (HIWORD(GetQueueStatus(QS_ALLINPUT)) != 0) {
+ if (HIWORD(GetQueueStatus(QS_ALLPOSTMESSAGE)) != 0) {
return;
}
@@ -79,12 +79,14 @@ MSWindowsEventQueueBuffer::waitForEvent(double timeout)
// cancellation but that's okay because we're run in the main
// thread and we never cancel that thread.
HANDLE dummy[1];
- MsgWaitForMultipleObjects(0, dummy, FALSE, t, QS_ALLINPUT);
+ MsgWaitForMultipleObjects(0, dummy, FALSE, t, QS_ALLPOSTMESSAGE);
}
IEventQueueBuffer::Type
MSWindowsEventQueueBuffer::getEvent(Event& event, UInt32& dataID)
{
+ // NOTE: QS_ALLINPUT was replaced with QS_ALLPOSTMESSAGE.
+ //
// peek at messages first. waiting for QS_ALLINPUT will return
// if a message has been sent to our window but GetMessage will
// dispatch that message behind our backs and block. PeekMessage
@@ -128,7 +130,7 @@ MSWindowsEventQueueBuffer::addEvent(UInt32 dataID)
bool
MSWindowsEventQueueBuffer::isEmpty() const
{
- return (HIWORD(GetQueueStatus(QS_ALLINPUT)) == 0);
+ return (HIWORD(GetQueueStatus(QS_ALLPOSTMESSAGE)) == 0);
}
EventQueueTimer*
diff --git a/src/lib/platform/OSXScreen.mm b/src/lib/platform/OSXScreen.mm
index 6c24a487..93bec0e9 100644
--- a/src/lib/platform/OSXScreen.mm
+++ b/src/lib/platform/OSXScreen.mm
@@ -39,6 +39,7 @@
#include "base/IEventQueue.h"
#include "base/TMethodEventJob.h"
#include "base/TMethodJob.h"
+#include "synergy/DisplayInvalidException.h"
#include
#include
@@ -107,7 +108,7 @@ OSXScreen::OSXScreen(IEventQueue* events, bool isPrimary, bool autoShowHideCurso
{
m_displayID = CGMainDisplayID();
if (!updateScreenShape(m_displayID, 0)) {
- throw std::runtime_error ("failed to initialize screen shape");
+ throw DisplayInvalidException ("failed to initialize screen shape");
}
try {
diff --git a/src/lib/server/ClientListener.cpp b/src/lib/server/ClientListener.cpp
index 0ecdb0e6..d7ee675a 100644
--- a/src/lib/server/ClientListener.cpp
+++ b/src/lib/server/ClientListener.cpp
@@ -45,7 +45,7 @@ ClientListener::ClientListener(const NetworkAddress& address,
assert(m_socketFactory != NULL);
try {
- m_listen = m_socketFactory->createListen(m_useSecureNetwork);
+ m_listen = m_socketFactory->createListen(m_useSecureNetwork, ARCH->getAddrFamily(address.getAddress()));
// setup event handler
m_events->adoptHandler(m_events->forIListenSocket().connecting(),
diff --git a/src/lib/synergy/App.cpp b/src/lib/synergy/App.cpp
index 4c8c1808..78511608 100644
--- a/src/lib/synergy/App.cpp
+++ b/src/lib/synergy/App.cpp
@@ -32,6 +32,7 @@
#include "ipc/IpcMessage.h"
#include "ipc/Ipc.h"
#include "base/EventQueue.h"
+#include "DisplayInvalidException.h"
#if SYSAPI_WIN32
#include "arch/win32/ArchMiscWindows.h"
@@ -50,6 +51,7 @@
#include "platform/OSXDragSimulator.h"
#endif
+
App* App::s_instance = nullptr;
//
@@ -125,6 +127,15 @@ App::run(int argc, char** argv)
// using the exit(int) function!
result = e.getCode();
}
+ catch (DisplayInvalidException& die) {
+ LOG((CLOG_CRIT "A display invalid exception error occurred: %s\n", die.what()));
+ // display invalid exceptions can occur when going to sleep. When this process exits, the
+ // UI will restart us instantly. We don't really want that behevior, so we quies for a bit
+ ARCH->sleep(10);
+ }
+ catch (std::runtime_error& re) {
+ LOG((CLOG_CRIT "A runtime error occurred: %s\n", re.what()));
+ }
catch (std::exception& e) {
LOG((CLOG_CRIT "An error occurred: %s\n", e.what()));
}
diff --git a/src/lib/synergy/DisplayInvalidException.h b/src/lib/synergy/DisplayInvalidException.h
new file mode 100644
index 00000000..bdc32801
--- /dev/null
+++ b/src/lib/synergy/DisplayInvalidException.h
@@ -0,0 +1,39 @@
+/*
+ * synergy -- mouse and keyboard sharing utility
+ * Copyright (C) 2012-2018 Symless Ltd.
+ * Copyright (C) 2002 Chris Schoeneman
+ *
+ * This package is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * found in the file LICENSE that should have accompanied this file.
+ *
+ * This package 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#ifndef SYNERGY_DISPLAYINVALIDEXCEPTION_H
+#define SYNERGY_DISPLAYINVALIDEXCEPTION_H
+
+
+#include
+#include
+
+class DisplayInvalidException : public std::runtime_error {
+ public:
+ DisplayInvalidException(const char* msg):
+ std::runtime_error(msg)
+ {
+ }
+
+ DisplayInvalidException(std::string msg):
+ std::runtime_error(msg)
+ {
+ }
+};
+
+
+#endif //SYNERGY_DISPLAYINVALIDEXCEPTION_H
diff --git a/src/test/unittests/synergy/ClipboardChunkTests.cpp b/src/test/unittests/synergy/ClipboardChunkTests.cpp
index 1e547a46..b33d85f0 100644
--- a/src/test/unittests/synergy/ClipboardChunkTests.cpp
+++ b/src/test/unittests/synergy/ClipboardChunkTests.cpp
@@ -22,19 +22,6 @@
TEST(ClipboardChunkTests, start_formatStartChunk)
{
-<<<<<<< HEAD
- ClipboardID id = 0;
- UInt32 sequence = 0;
- String mockDataSize("10");
- ClipboardChunk* chunk = ClipboardChunk::start(id, sequence, mockDataSize);
-
- EXPECT_EQ(id, chunk->m_chunk[0]);
- EXPECT_EQ(sequence, (UInt32)chunk->m_chunk[1]);
- EXPECT_EQ(kDataStart, chunk->m_chunk[5]);
- EXPECT_EQ('1', chunk->m_chunk[6]);
- EXPECT_EQ('0', chunk->m_chunk[7]);
- EXPECT_EQ('\0', chunk->m_chunk[8]);
-=======
ClipboardID id = 0;
UInt32 sequence = 0;
String mockDataSize("10");
@@ -48,14 +35,12 @@ TEST(ClipboardChunkTests, start_formatStartChunk)
EXPECT_EQ('1', chunk->m_chunk[6]);
EXPECT_EQ('0', chunk->m_chunk[7]);
EXPECT_EQ('\0', chunk->m_chunk[8]);
->>>>>>> master
delete chunk;
}
TEST(ClipboardChunkTests, data_formatDataChunk)
{
-<<<<<<< HEAD
ClipboardID id = 0;
UInt32 sequence = 1;
String mockData("mock data");
@@ -74,35 +59,12 @@ TEST(ClipboardChunkTests, data_formatDataChunk)
EXPECT_EQ('t', chunk->m_chunk[13]);
EXPECT_EQ('a', chunk->m_chunk[14]);
EXPECT_EQ('\0', chunk->m_chunk[15]);
-=======
- ClipboardID id = 0;
- UInt32 sequence = 1;
- String mockData("mock data");
- ClipboardChunk* chunk = ClipboardChunk::data(id, sequence, mockData);
- UInt32 temp_m_chunk;
- memcpy(&temp_m_chunk, &(chunk->m_chunk[1]), 4);
-
- EXPECT_EQ(id, chunk->m_chunk[0]);
- EXPECT_EQ(sequence, temp_m_chunk);
- EXPECT_EQ(kDataChunk, chunk->m_chunk[5]);
- EXPECT_EQ('m', chunk->m_chunk[6]);
- EXPECT_EQ('o', chunk->m_chunk[7]);
- EXPECT_EQ('c', chunk->m_chunk[8]);
- EXPECT_EQ('k', chunk->m_chunk[9]);
- EXPECT_EQ(' ', chunk->m_chunk[10]);
- EXPECT_EQ('d', chunk->m_chunk[11]);
- EXPECT_EQ('a', chunk->m_chunk[12]);
- EXPECT_EQ('t', chunk->m_chunk[13]);
- EXPECT_EQ('a', chunk->m_chunk[14]);
- EXPECT_EQ('\0', chunk->m_chunk[15]);
->>>>>>> master
delete chunk;
}
TEST(ClipboardChunkTests, end_formatDataChunk)
{
-<<<<<<< HEAD
ClipboardID id = 1;
UInt32 sequence = 1;
ClipboardChunk* chunk = ClipboardChunk::end(id, sequence);
@@ -111,18 +73,6 @@ TEST(ClipboardChunkTests, end_formatDataChunk)
EXPECT_EQ(sequence, (UInt32)chunk->m_chunk[1]);
EXPECT_EQ(kDataEnd, chunk->m_chunk[5]);
EXPECT_EQ('\0', chunk->m_chunk[6]);
-=======
- ClipboardID id = 1;
- UInt32 sequence = 1;
- ClipboardChunk* chunk = ClipboardChunk::end(id, sequence);
- UInt32 temp_m_chunk;
- memcpy(&temp_m_chunk, &(chunk->m_chunk[1]), 4);
-
- EXPECT_EQ(id, chunk->m_chunk[0]);
- EXPECT_EQ(sequence, temp_m_chunk);
- EXPECT_EQ(kDataEnd, chunk->m_chunk[5]);
- EXPECT_EQ('\0', chunk->m_chunk[6]);
->>>>>>> master
delete chunk;
}