diff --git a/compat.c b/compat.c index bd3270c8..84510063 100644 --- a/compat.c +++ b/compat.c @@ -262,13 +262,14 @@ char *openconnect__win32_strerror(DWORD err) return msgutf8; } -void openconnect__win32_sock_init() +int openconnect__win32_sock_init() { WSADATA data; if (WSAStartup (MAKEWORD(1, 1), &data) != 0) { fprintf(stderr, _("ERROR: Cannot initialize sockets\n")); - exit(1); + return -EIO; } + return 0; } int openconnect__win32_inet_pton(int af, const char *src, void *dst) diff --git a/gnutls.c b/gnutls.c index d1068357..76ef5b9c 100644 --- a/gnutls.c +++ b/gnutls.c @@ -2161,12 +2161,17 @@ void openconnect_close_https(struct openconnect_info *vpninfo, int final) } } -void openconnect_init_ssl(void) +int openconnect_init_ssl(void) { #ifdef _WIN32 - openconnect__win32_sock_init(); + int ret = openconnect__win32_sock_init(); + if (ret) + return ret; #endif - gnutls_global_init(); + if (gnutls_global_init()) + return -EIO; + else + return 0; } char *get_gnutls_cipher(gnutls_session_t session) diff --git a/openconnect-internal.h b/openconnect-internal.h index 065263d5..d2157d6a 100644 --- a/openconnect-internal.h +++ b/openconnect-internal.h @@ -526,7 +526,7 @@ static inline int set_fd_cloexec(int fd) #ifdef _WIN32 #define pipe(fds) _pipe(fds, 4096, O_BINARY) -void openconnect__win32_sock_init(); +int openconnect__win32_sock_init(); char *openconnect__win32_strerror(DWORD err); #undef inet_pton #define inet_pton openconnect__win32_inet_pton diff --git a/openconnect.h b/openconnect.h index a6c6215f..d611103b 100644 --- a/openconnect.h +++ b/openconnect.h @@ -35,6 +35,7 @@ * API version 4.1: * - Add openconnect_get_cstp_cipher(), openconnect_get_dtls_cipher(), * openconnect_set_system_trust(). + * - Change openconnect_init_ssl() to return int. * * API version 4.0: * - Change string handling to never transfer ownership of allocations. @@ -305,7 +306,7 @@ int openconnect_set_http_proxy(struct openconnect_info *vpninfo, const char *proxy); int openconnect_passphrase_from_fsid(struct openconnect_info *vpninfo); int openconnect_obtain_cookie(struct openconnect_info *vpninfo); -void openconnect_init_ssl(void); +int openconnect_init_ssl(void); /* These are strictly cosmetic. The strings differ depending on * whether OpenSSL or GnuTLS is being used. And even depending on the diff --git a/openssl.c b/openssl.c index 6bbd267b..a08f591f 100644 --- a/openssl.c +++ b/openssl.c @@ -1547,15 +1547,18 @@ void openconnect_close_https(struct openconnect_info *vpninfo, int final) } } -void openconnect_init_ssl(void) +int openconnect_init_ssl(void) { #ifdef _WIN32 - openconnect__win32_sock_init(); + int ret = openconnect__win32_sock_init(); + if (ret) + return ret; #endif SSL_library_init(); ERR_clear_error(); SSL_load_error_strings(); OpenSSL_add_all_algorithms(); + return 0; } char *openconnect_get_cert_details(struct openconnect_info *vpninfo,