47ffb59c60d8ca5a48c798c2b5a5311e5f7bc31f
[strongswan.git] / src / libhydra / hydra.c
1 /*
2 * Copyright (C) 2010 Tobias Brunner
3 * Hochschule fuer Technik Rapperswil
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the
7 * Free Software Foundation; either version 2 of the License, or (at your
8 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
9 *
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 * for more details.
14 */
15
16 #include "hydra.h"
17
18 #include <utils/debug.h>
19
20 typedef struct private_hydra_t private_hydra_t;
21
22 /**
23 * Private additions to hydra_t.
24 */
25 struct private_hydra_t {
26
27 /**
28 * Public members of hydra_t.
29 */
30 hydra_t public;
31
32 /**
33 * Integrity check failed?
34 */
35 bool integrity_failed;
36
37 /**
38 * Number of times we have been initialized
39 */
40 refcount_t ref;
41 };
42
43 /**
44 * Single instance of hydra_t.
45 */
46 hydra_t *hydra = NULL;
47
48 /**
49 * Described in header.
50 */
51 void libhydra_deinit()
52 {
53 private_hydra_t *this = (private_hydra_t*)hydra;
54
55 if (!this || !ref_put(&this->ref))
56 { /* have more users */
57 return;
58 }
59
60 this->public.kernel_interface->destroy(this->public.kernel_interface);
61 free(this);
62 hydra = NULL;
63 }
64
65 /**
66 * Described in header.
67 */
68 bool libhydra_init()
69 {
70 private_hydra_t *this;
71
72 if (hydra)
73 { /* already initialized, increase refcount */
74 this = (private_hydra_t*)hydra;
75 ref_get(&this->ref);
76 return !this->integrity_failed;
77 }
78
79 INIT(this,
80 .ref = 1,
81 );
82 hydra = &this->public;
83
84 this->public.kernel_interface = kernel_interface_create();
85
86 if (lib->integrity &&
87 !lib->integrity->check(lib->integrity, "libhydra", libhydra_init))
88 {
89 DBG1(DBG_LIB, "integrity check of libhydra failed");
90 this->integrity_failed = TRUE;
91 }
92 return !this->integrity_failed;
93 }