libhydra: Move kernel interface to libcharon
[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 free(this);
61 hydra = NULL;
62 }
63
64 /**
65 * Described in header.
66 */
67 bool libhydra_init()
68 {
69 private_hydra_t *this;
70
71 if (hydra)
72 { /* already initialized, increase refcount */
73 this = (private_hydra_t*)hydra;
74 ref_get(&this->ref);
75 return !this->integrity_failed;
76 }
77
78 INIT(this,
79 .ref = 1,
80 );
81 hydra = &this->public;
82
83 if (lib->integrity &&
84 !lib->integrity->check(lib->integrity, "libhydra", libhydra_init))
85 {
86 DBG1(DBG_LIB, "integrity check of libhydra failed");
87 this->integrity_failed = TRUE;
88 }
89 return !this->integrity_failed;
90 }