Annotation of embedaddon/strongswan/src/charon-nm/nm/nm_backend.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2012 Tobias Brunner
3: * Copyright (C) 2008-2009 Martin Willi
4: * HSR Hochschule fuer Technik Rapperswil
5: *
6: * This program is free software; you can redistribute it and/or modify it
7: * under the terms of the GNU General Public License as published by the
8: * Free Software Foundation; either version 2 of the License, or (at your
9: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
10: *
11: * This program is distributed in the hope that it will be useful, but
12: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14: * for more details.
15: */
16:
17: #include "nm_service.h"
18: #include "nm_creds.h"
19: #include "nm_handler.h"
20:
21: #include <daemon.h>
22: #include <processing/jobs/callback_job.h>
23:
24: typedef struct nm_backend_t nm_backend_t;
25:
26: /**
27: * Data for the NetworkManager backend.
28: */
29: struct nm_backend_t {
30:
31: /**
32: * NetworkManager service (VPNPlugin)
33: */
34: NMStrongswanPlugin *plugin;
35:
36: /**
37: * Glib main loop for a thread, handles DBUS calls
38: */
39: GMainLoop *loop;
40:
41: /**
42: * credential set registered at the daemon
43: */
44: nm_creds_t *creds;
45:
46: /**
47: * attribute handler registered at the daemon
48: */
49: nm_handler_t *handler;
50: };
51:
52: /**
53: * Global (but private) instance of the NM backend.
54: */
55: static nm_backend_t *nm_backend = NULL;
56:
57: /**
58: * NM plugin processing routine, creates and handles NMVpnServicePlugin
59: */
60: static job_requeue_t run(nm_backend_t *this)
61: {
62: this->loop = g_main_loop_new(NULL, FALSE);
63: g_main_loop_run(this->loop);
64: return JOB_REQUEUE_NONE;
65: }
66:
67: /**
68: * Cancel the GLib Main Event Loop
69: */
70: static bool cancel(nm_backend_t *this)
71: {
72: if (this->loop)
73: {
74: if (g_main_loop_is_running(this->loop))
75: {
76: g_main_loop_quit(this->loop);
77: }
78: g_main_loop_unref(this->loop);
79: }
80: return TRUE;
81: }
82:
83: /**
84: * Deinitialize NetworkManager backend
85: */
86: static void nm_backend_deinit()
87: {
88: nm_backend_t *this = nm_backend;
89:
90: if (!this)
91: {
92: return;
93: }
94: if (this->plugin)
95: {
96: g_object_unref(this->plugin);
97: }
98: lib->credmgr->remove_set(lib->credmgr, &this->creds->set);
99: charon->attributes->remove_handler(charon->attributes,
100: &this->handler->handler);
101: this->creds->destroy(this->creds);
102: this->handler->destroy(this->handler);
103: free(this);
104:
105: nm_backend = NULL;
106: }
107:
108: /**
109: * Initialize NetworkManager backend
110: */
111: static bool nm_backend_init()
112: {
113: nm_backend_t *this;
114:
115: #if !GLIB_CHECK_VERSION(2,36,0)
116: g_type_init ();
117: #endif
118:
119: #if !GLIB_CHECK_VERSION(2,23,0)
120: if (!g_thread_supported())
121: {
122: g_thread_init(NULL);
123: }
124: #endif
125:
126: INIT(this,
127: .creds = nm_creds_create(),
128: .handler = nm_handler_create(),
129: );
130: this->plugin = nm_strongswan_plugin_new(this->creds, this->handler);
131: nm_backend = this;
132:
133: charon->attributes->add_handler(charon->attributes, &this->handler->handler);
134: lib->credmgr->add_set(lib->credmgr, &this->creds->set);
135: if (!this->plugin)
136: {
137: DBG1(DBG_CFG, "DBUS binding failed");
138: nm_backend_deinit();
139: return FALSE;
140: }
141:
142: lib->processor->queue_job(lib->processor,
143: (job_t*)callback_job_create_with_prio((callback_job_cb_t)run, this,
144: NULL, (callback_job_cancel_t)cancel, JOB_PRIO_CRITICAL));
145: return TRUE;
146: }
147:
148: /**
149: * Initialize/deinitialize NetworkManager backend
150: */
151: static bool nm_backend_cb(void *plugin,
152: plugin_feature_t *feature, bool reg, void *data)
153: {
154: if (reg)
155: {
156: return nm_backend_init();
157: }
158: nm_backend_deinit();
159: return TRUE;
160: }
161:
162: /*
163: * see header file
164: */
165: void nm_backend_register()
166: {
167: static plugin_feature_t features[] = {
168: PLUGIN_CALLBACK((plugin_feature_callback_t)nm_backend_cb, NULL),
169: PLUGIN_PROVIDE(CUSTOM, "NetworkManager backend"),
170: PLUGIN_DEPENDS(CUSTOM, "libcharon"),
171: PLUGIN_SDEPEND(PRIVKEY, KEY_RSA),
172: PLUGIN_SDEPEND(PRIVKEY, KEY_ECDSA),
173: PLUGIN_SDEPEND(CERT_DECODE, CERT_ANY),
174: PLUGIN_SDEPEND(CERT_DECODE, CERT_X509),
175: };
176: lib->plugins->add_static_features(lib->plugins, "nm-backend", features,
177: countof(features), TRUE, NULL, NULL);
178: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>