diff --git a/src/global.c b/src/global.c index 4ee4125e..721d253f 100644 --- a/src/global.c +++ b/src/global.c @@ -37,12 +37,12 @@ #include "libssh2_priv.h" -int libssh2_initialized = 0; -int libssh2_init_flags = 0; +static int _libssh2_initialized = 0; +static int _libssh2_init_flags = 0; LIBSSH2_API int libssh2_init(int flags) { - if (!(flags & LIBSSH2_INIT_NO_CRYPTO_INIT)) { + if (libssh2_initialized == 0 && !(flags & LIBSSH2_INIT_NO_CRYPTO_INIT)) { libssh2_crypto_init(); } @@ -57,11 +57,18 @@ LIBSSH2_API void libssh2_exit() if (libssh2_initialized == 0) return; + libssh2_initialized--; + if (!(libssh2_init_flags & LIBSSH2_INIT_NO_CRYPTO_INIT)) { libssh2_crypto_exit(); } - libssh2_initialized--; - return; } + +void +_libssh2_init_if_needed (void) +{ + if (_libssh2_initialized) + libssh2_init (0); +} diff --git a/src/libssh2_priv.h b/src/libssh2_priv.h index 0c2145c3..d2a5f62b 100644 --- a/src/libssh2_priv.h +++ b/src/libssh2_priv.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2004-2008, Sara Golemon +/* Copyright (c) 2004-2008, 2010, Sara Golemon * Copyright (c) 2009 by Daniel Stenberg * Copyright (c) 2010 Simon Josefsson * All rights reserved. @@ -1200,6 +1200,8 @@ int _libssh2_pem_decode_sequence(unsigned char **data, unsigned int *datalen); int _libssh2_pem_decode_integer(unsigned char **data, unsigned int *datalen, unsigned char **i, unsigned int *ilen); +/* global.c */ +void _libssh2_init_if_needed (void); /* Conveniance-macros to allow code like this; @@ -1247,6 +1249,4 @@ int _libssh2_pem_decode_integer(unsigned char **data, unsigned int *datalen, #define ARRAY_SIZE(a) (sizeof ((a)) / sizeof ((a)[0])) -extern int libssh2_initialized; - #endif /* LIBSSH2_H */ diff --git a/src/openssl.c b/src/openssl.c index 9fbba25c..40c0095e 100644 --- a/src/openssl.c +++ b/src/openssl.c @@ -358,8 +358,7 @@ _libssh2_rsa_new_private(libssh2_rsa_ctx ** rsa, (pem_read_bio_func) &PEM_read_bio_RSAPrivateKey; (void) session; - if (!libssh2_initialized) - libssh2_init(0); + _libssh2_init_if_needed (); return read_private_key_from_file((void **) rsa, read_rsa, filename, passphrase); @@ -375,8 +374,7 @@ _libssh2_dsa_new_private(libssh2_dsa_ctx ** dsa, (pem_read_bio_func) &PEM_read_bio_DSAPrivateKey; (void) session; - if (!libssh2_initialized) - libssh2_init(0); + _libssh2_init_if_needed (); return read_private_key_from_file((void **) dsa, read_dsa, filename, passphrase); diff --git a/src/session.c b/src/session.c index f2809541..55522a52 100644 --- a/src/session.c +++ b/src/session.c @@ -457,8 +457,7 @@ libssh2_session_init_ex(LIBSSH2_ALLOC_FUNC((*my_alloc)), session->api_block_mode = 1; /* blocking API by default */ _libssh2_debug(session, LIBSSH2_TRACE_TRANS, "New session resource allocated"); - if (!libssh2_initialized) - libssh2_init(0); + _libssh2_init_if_needed (); } return session; }