diff --git a/src/_cffi_src/build_openssl.py b/src/_cffi_src/build_openssl.py index 49f846ce8d3a64b8be5337616e90d02fbdebd26d_c3JjL19jZmZpX3NyYy9idWlsZF9vcGVuc3NsLnB5..0a7f1c0932d73ebcdde201691928773a98037be4_c3JjL19jZmZpX3NyYy9idWlsZF9vcGVuc3NsLnB5 100644 --- a/src/_cffi_src/build_openssl.py +++ b/src/_cffi_src/build_openssl.py @@ -40,7 +40,10 @@ # -lpthread required due to usage of pthread an potential # existance of a static part containing e.g. pthread_atfork # (https://github.com/pyca/cryptography/issues/5084) - return ["ssl", "crypto", "pthread"] + if sys.platform == 'zos': + return ["ssl", "crypto"] + else: + return ["ssl", "crypto", "pthread"] def _extra_compile_args(platform): diff --git a/src/_cffi_src/openssl/callbacks.py b/src/_cffi_src/openssl/callbacks.py index 49f846ce8d3a64b8be5337616e90d02fbdebd26d_c3JjL19jZmZpX3NyYy9vcGVuc3NsL2NhbGxiYWNrcy5weQ==..0a7f1c0932d73ebcdde201691928773a98037be4_c3JjL19jZmZpX3NyYy9vcGVuc3NsL2NhbGxiYWNrcy5weQ== 100644 --- a/src/_cffi_src/openssl/callbacks.py +++ b/src/_cffi_src/openssl/callbacks.py @@ -20,6 +20,10 @@ #include <stdlib.h> #include <pthread.h> #endif + +#ifdef __MVS__ +#include <errno.h> +#endif """ TYPES = """ @@ -66,7 +70,19 @@ perror("Fatal error in callback initialization: " #call); \ abort(); \ } +#ifdef __MVS__ +/* When pthread_mutex_init is called more than once on the same mutex, + on z/OS this throws an EBUSY error. +*/ +#define ASSERT_STATUS_INIT(call) \ + if ((call) != 0 && errno != EBUSY) { \ + perror("Fatal error in callback initialization: " #call); \ + abort(); \ + } +#else +#define ASSERT_STATUS_INIT ASSERT_STATUS +#endif static inline void cryptography_mutex_init(Cryptography_mutex *mutex) { #if !defined(pthread_mutexattr_default) # define pthread_mutexattr_default ((pthread_mutexattr_t *)NULL) #endif @@ -69,8 +85,8 @@ static inline void cryptography_mutex_init(Cryptography_mutex *mutex) { #if !defined(pthread_mutexattr_default) # define pthread_mutexattr_default ((pthread_mutexattr_t *)NULL) #endif - ASSERT_STATUS(pthread_mutex_init(mutex, pthread_mutexattr_default)); + ASSERT_STATUS_INIT(pthread_mutex_init(mutex, pthread_mutexattr_default)); } static inline void cryptography_mutex_lock(Cryptography_mutex *mutex) { ASSERT_STATUS(pthread_mutex_lock(mutex)); diff --git a/src/_cffi_src/openssl/src/osrandom_engine.h b/src/_cffi_src/openssl/src/osrandom_engine.h index 49f846ce8d3a64b8be5337616e90d02fbdebd26d_c3JjL19jZmZpX3NyYy9vcGVuc3NsL3NyYy9vc3JhbmRvbV9lbmdpbmUuaA==..0a7f1c0932d73ebcdde201691928773a98037be4_c3JjL19jZmZpX3NyYy9vcGVuc3NsL3NyYy9vc3JhbmRvbV9lbmdpbmUuaA== 100644 --- a/src/_cffi_src/openssl/src/osrandom_engine.h +++ b/src/_cffi_src/openssl/src/osrandom_engine.h @@ -6,7 +6,9 @@ #include <fcntl.h> #include <unistd.h> /* for defined(BSD) */ - #include <sys/param.h> + #ifndef __MVS__ + #include <sys/param.h> + #endif #ifdef BSD /* for SYS_getentropy */