1 /* Copyright (c) 2010 Lars Nordin <Lars.Nordin@SDlabs.se>
2  * Copyright (C) 2010 Simon Josefsson <simon@josefsson.org>
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms,
6  * with or without modification, are permitted provided
7  * that the following conditions are met:
8  *
9  *   Redistributions of source code must retain the above
10  *   copyright notice, this list of conditions and the
11  *   following disclaimer.
12  *
13  *   Redistributions in binary form must reproduce the above
14  *   copyright notice, this list of conditions and the following
15  *   disclaimer in the documentation and/or other materials
16  *   provided with the distribution.
17  *
18  *   Neither the name of the copyright holder nor the names
19  *   of any other contributors may be used to endorse or
20  *   promote products derived from this software without
21  *   specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
24  * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
25  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
26  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
28  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
30  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
31  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
33  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
35  * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
36  * OF SUCH DAMAGE.
37  */
38 
39 #include "libssh2_priv.h"
40 
41 static int _libssh2_initialized = 0;
42 static int _libssh2_init_flags = 0;
43 
44 LIBSSH2_API int
libssh2_init(int flags)45 libssh2_init(int flags)
46 {
47     if(_libssh2_initialized == 0 && !(flags & LIBSSH2_INIT_NO_CRYPTO)) {
48         libssh2_crypto_init();
49     }
50 
51     _libssh2_initialized++;
52     _libssh2_init_flags |= flags;
53 
54     return 0;
55 }
56 
57 LIBSSH2_API void
libssh2_exit(void)58 libssh2_exit(void)
59 {
60     if(_libssh2_initialized == 0)
61         return;
62 
63     _libssh2_initialized--;
64 
65     if(!(_libssh2_init_flags & LIBSSH2_INIT_NO_CRYPTO)) {
66         libssh2_crypto_exit();
67     }
68 
69     return;
70 }
71 
72 void
_libssh2_init_if_needed(void)73 _libssh2_init_if_needed(void)
74 {
75     if(_libssh2_initialized == 0)
76         (void)libssh2_init (0);
77 }
78