Annotation of embedaddon/strongswan/src/libtnccs/tnc/tnc.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2011 Andreas Steffen
3: * HSR 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: #define _GNU_SOURCE /* for stdndup() */
17: #include <sys/types.h>
18: #include <sys/stat.h>
19: #include <unistd.h>
20: #include <errno.h>
21: #include <fcntl.h>
22: #include <string.h>
23:
24: #include "tnc.h"
25:
26: #include <utils/lexparser.h>
27: #include <utils/debug.h>
28:
29: #ifdef WIN32
30: # define DEFAULT_TNC_CONFIG "tnc_config"
31: #else
32: # define DEFAULT_TNC_CONFIG "/etc/tnc_config"
33: #endif
34:
35: typedef struct private_tnc_t private_tnc_t;
36:
37: typedef tnccs_manager_t *(*tnc_create_tnccs_manager_t)(void);
38: typedef imc_manager_t *(*tnc_create_imc_manager_t)(void);
39: typedef imv_manager_t *(*tnc_create_imv_manager_t)(void);
40:
41: /**
42: * Private additions to tnc_t.
43: */
44: struct private_tnc_t {
45:
46: /**
47: * Public members of tnc_t.
48: */
49: tnc_t public;
50:
51: /**
52: * Number of times we have been initialized
53: */
54: refcount_t ref;
55: };
56:
57: /**
58: * Register plugins if built statically
59: */
60: #ifdef STATIC_PLUGIN_CONSTRUCTORS
61: #include "plugin_constructors.c"
62: #endif
63:
64: /**
65: * Single instance of tnc_t.
66: */
67: tnc_t *tnc;
68:
69: /**
70: * Described in header.
71: */
72: void libtnccs_init(void)
73: {
74: private_tnc_t *this;
75:
76: if (tnc)
77: { /* already initialized, increase refcount */
78: this = (private_tnc_t*)tnc;
79: ref_get(&this->ref);
80: return;
81: }
82:
83: INIT(this,
84: .public = {
85: },
86: .ref = 1,
87: );
88: tnc = &this->public;
89: lib->settings->add_fallback(lib->settings, "%s.tnc", "libtnccs", lib->ns);
90: lib->settings->add_fallback(lib->settings, "%s.plugins", "libtnccs.plugins",
91: lib->ns);
92: }
93:
94: /**
95: * Described in header.
96: */
97: void libtnccs_deinit(void)
98: {
99: private_tnc_t *this = (private_tnc_t*)tnc;
100:
101: if (!this || !ref_put(&this->ref))
102: { /* have more users */
103: return;
104: }
105:
106: free(this);
107: tnc = NULL;
108: }
109:
110: static bool load_imcvs_from_config(char *filename, bool is_imc)
111: {
112: bool success = FALSE;
113: int line_nr = 0;
114: chunk_t *src, line;
115: char *label;
116:
117: if (!filename || !*filename)
118: {
119: return TRUE;
120: }
121:
122: label = is_imc ? "IMC" : "IMV";
123:
124: DBG1(DBG_TNC, "loading %ss from '%s'", label, filename);
125: src = chunk_map(filename, FALSE);
126: if (!src)
127: {
128: DBG1(DBG_TNC, "opening configuration file '%s' failed: %s", filename,
129: strerror(errno));
130: return FALSE;
131: }
132:
133: while (fetchline(src, &line))
134: {
135: char *name, *path;
136: chunk_t token;
137:
138: line_nr++;
139:
140: /* skip comments or empty lines */
141: if (*line.ptr == '#' || !eat_whitespace(&line))
142: {
143: continue;
144: }
145:
146: /* determine keyword */
147: if (!extract_token(&token, ' ', &line))
148: {
149: DBG1(DBG_TNC, "line %d: keyword must be followed by a space",
150: line_nr);
151: break;
152: }
153:
154: /* only interested in IMCs or IMVs depending on label */
155: if (!match(label, &token))
156: {
157: continue;
158: }
159:
160: /* advance to the IMC/IMV name and extract it */
161: if (!extract_token(&token, '"', &line) ||
162: !extract_token(&token, '"', &line))
163: {
164: DBG1(DBG_TNC, "line %d: %s name must be set in double quotes",
165: line_nr, label);
166: break;
167: }
168:
169: /* copy the IMC/IMV name */
170: name = strndup(token.ptr, token.len);
171:
172: /* advance to the IMC/IMV path and extract it */
173: if (!eat_whitespace(&line))
174: {
175: DBG1(DBG_TNC, "line %d: %s path is missing", line_nr, label);
176: free(name);
177: break;
178: }
179: if (!extract_token(&token, ' ', &line))
180: {
181: token = line;
182: }
183:
184: /* copy the IMC/IMV path */
185: path = strndup(token.ptr, token.len);
186:
187: /* load and register an IMC/IMV instance */
188: if (is_imc)
189: {
190: success = tnc->imcs->load(tnc->imcs, name, path);
191: }
192: else
193: {
194: success = tnc->imvs->load(tnc->imvs, name, path);
195: }
196: free(name);
197: free(path);
198: if (!success)
199: {
200: break;
201: }
202: }
203: chunk_unmap(src);
204: return success;
205: }
206:
207: /**
208: * Described in header.
209: */
210: bool tnc_manager_register(plugin_t *plugin, plugin_feature_t *feature,
211: bool reg, void *data)
212: {
213: bool load_imcvs = FALSE;
214: bool is_imc = FALSE;
215:
216: if (feature->type == FEATURE_CUSTOM)
217: {
218: if (streq(feature->arg.custom, "tnccs-manager"))
219: {
220: if (reg)
221: {
222: tnc->tnccs = ((tnc_create_tnccs_manager_t)data)();
223: }
224: else
225: {
226: tnc->tnccs->destroy(tnc->tnccs);
227: tnc->tnccs = NULL;
228: }
229: }
230: else if (streq(feature->arg.custom, "imc-manager"))
231: {
232: if (reg)
233: {
234: tnc->imcs = ((tnc_create_imc_manager_t)data)();
235: is_imc = TRUE;
236: load_imcvs = TRUE;
237: }
238: else
239: {
240: tnc->imcs->destroy(tnc->imcs);
241: tnc->imcs = NULL;
242: }
243: }
244: else if (streq(feature->arg.custom, "imv-manager"))
245: {
246: if (reg)
247: {
248: tnc->imvs = ((tnc_create_imv_manager_t)data)();
249: is_imc = FALSE;
250: load_imcvs = TRUE;
251: }
252: else
253: {
254: tnc->imvs->destroy(tnc->imvs);
255: tnc->imvs = NULL;
256: }
257: }
258: else
259: {
260: return FALSE;
261: }
262:
263: if (load_imcvs)
264: {
265: load_imcvs_from_config(
266: lib->settings->get_str(lib->settings,
267: "%s.tnc.tnc_config", DEFAULT_TNC_CONFIG, lib->ns),
268: is_imc);
269: }
270: }
271: return TRUE;
272: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>