]>
Commit | Line | Data |
---|---|---|
6dbce9c8 | 1 | /* |
b64f3336 | 2 | * Copyright (C) 2012 Tobias Brunner |
3ab0e8a0 | 3 | * Copyright (C) 2008-2009 Martin Willi |
1b671669 | 4 | * HSR Hochschule fuer Technik Rapperswil |
6dbce9c8 MW |
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. | |
6dbce9c8 MW |
15 | */ |
16 | ||
706a579e TB |
17 | #include <sys/types.h> |
18 | #include <unistd.h> | |
19 | ||
6dbce9c8 | 20 | #include "nm_service.h" |
ec249871 | 21 | #include "nm_creds.h" |
3ab0e8a0 | 22 | #include "nm_handler.h" |
6dbce9c8 MW |
23 | |
24 | #include <daemon.h> | |
25 | #include <processing/jobs/callback_job.h> | |
26 | ||
b64f3336 | 27 | typedef struct nm_backend_t nm_backend_t; |
6dbce9c8 MW |
28 | |
29 | /** | |
b64f3336 | 30 | * Data for the NetworkManager backend. |
6dbce9c8 | 31 | */ |
b64f3336 | 32 | struct nm_backend_t { |
7daf5226 | 33 | |
1b9f6c24 MW |
34 | /** |
35 | * NetworkManager service (VPNPlugin) | |
36 | */ | |
37 | NMStrongswanPlugin *plugin; | |
7daf5226 | 38 | |
ec249871 MW |
39 | /** |
40 | * Glib main loop for a thread, handles DBUS calls | |
41 | */ | |
6dbce9c8 | 42 | GMainLoop *loop; |
7daf5226 | 43 | |
ec249871 MW |
44 | /** |
45 | * credential set registered at the daemon | |
46 | */ | |
47 | nm_creds_t *creds; | |
7daf5226 | 48 | |
3ab0e8a0 | 49 | /** |
b3ab7a48 | 50 | * attribute handler registered at the daemon |
3ab0e8a0 MW |
51 | */ |
52 | nm_handler_t *handler; | |
6dbce9c8 MW |
53 | }; |
54 | ||
b64f3336 TB |
55 | /** |
56 | * Global (but private) instance of the NM backend. | |
57 | */ | |
58 | static nm_backend_t *nm_backend = NULL; | |
59 | ||
706a579e TB |
60 | /** |
61 | * Terminate the daemon if signaled by NM | |
62 | */ | |
63 | static void terminate(void *plugin, void *arg) | |
64 | { | |
65 | kill(getpid(), SIGTERM); | |
66 | } | |
67 | ||
6dbce9c8 | 68 | /** |
9a71b721 | 69 | * NM plugin processing routine, creates and handles NMVpnServicePlugin |
6dbce9c8 | 70 | */ |
b64f3336 | 71 | static job_requeue_t run(nm_backend_t *this) |
6dbce9c8 | 72 | { |
1b9f6c24 | 73 | this->loop = g_main_loop_new(NULL, FALSE); |
706a579e | 74 | g_signal_connect(this->plugin, "quit", G_CALLBACK(terminate), NULL); |
1b9f6c24 | 75 | g_main_loop_run(this->loop); |
6dbce9c8 MW |
76 | return JOB_REQUEUE_NONE; |
77 | } | |
78 | ||
26d77eb3 TB |
79 | /** |
80 | * Cancel the GLib Main Event Loop | |
81 | */ | |
82 | static bool cancel(nm_backend_t *this) | |
83 | { | |
84 | if (this->loop) | |
85 | { | |
86 | if (g_main_loop_is_running(this->loop)) | |
87 | { | |
88 | g_main_loop_quit(this->loop); | |
89 | } | |
90 | g_main_loop_unref(this->loop); | |
91 | } | |
92 | return TRUE; | |
93 | } | |
94 | ||
ec3b332b TB |
95 | /** |
96 | * Deinitialize NetworkManager backend | |
b64f3336 | 97 | */ |
ec3b332b | 98 | static void nm_backend_deinit() |
787b5884 | 99 | { |
b64f3336 | 100 | nm_backend_t *this = nm_backend; |
787b5884 | 101 | |
b64f3336 TB |
102 | if (!this) |
103 | { | |
104 | return; | |
105 | } | |
1b9f6c24 MW |
106 | if (this->plugin) |
107 | { | |
108 | g_object_unref(this->plugin); | |
109 | } | |
2ccc02a4 | 110 | lib->credmgr->remove_set(lib->credmgr, &this->creds->set); |
75136327 MW |
111 | charon->attributes->remove_handler(charon->attributes, |
112 | &this->handler->handler); | |
ec249871 | 113 | this->creds->destroy(this->creds); |
3ab0e8a0 | 114 | this->handler->destroy(this->handler); |
6dbce9c8 | 115 | free(this); |
b64f3336 TB |
116 | |
117 | nm_backend = NULL; | |
6dbce9c8 MW |
118 | } |
119 | ||
ec3b332b TB |
120 | /** |
121 | * Initialize NetworkManager backend | |
6dbce9c8 | 122 | */ |
ec3b332b | 123 | static bool nm_backend_init() |
6dbce9c8 | 124 | { |
b64f3336 | 125 | nm_backend_t *this; |
7daf5226 | 126 | |
896abbef | 127 | #if !GLIB_CHECK_VERSION(2,36,0) |
6dbce9c8 | 128 | g_type_init (); |
896abbef | 129 | #endif |
69c6a601 TB |
130 | |
131 | #if !GLIB_CHECK_VERSION(2,23,0) | |
6dbce9c8 MW |
132 | if (!g_thread_supported()) |
133 | { | |
134 | g_thread_init(NULL); | |
135 | } | |
69c6a601 | 136 | #endif |
7daf5226 | 137 | |
6e279171 | 138 | INIT(this, |
6e279171 MW |
139 | .creds = nm_creds_create(), |
140 | .handler = nm_handler_create(), | |
6e279171 | 141 | ); |
c1407572 | 142 | this->plugin = nm_strongswan_plugin_new(this->creds, this->handler); |
b64f3336 | 143 | nm_backend = this; |
6e279171 | 144 | |
75136327 | 145 | charon->attributes->add_handler(charon->attributes, &this->handler->handler); |
2ccc02a4 | 146 | lib->credmgr->add_set(lib->credmgr, &this->creds->set); |
1b9f6c24 MW |
147 | if (!this->plugin) |
148 | { | |
149 | DBG1(DBG_CFG, "DBUS binding failed"); | |
b64f3336 TB |
150 | nm_backend_deinit(); |
151 | return FALSE; | |
1b9f6c24 | 152 | } |
7daf5226 | 153 | |
bb381e26 | 154 | lib->processor->queue_job(lib->processor, |
26d77eb3 TB |
155 | (job_t*)callback_job_create_with_prio((callback_job_cb_t)run, this, |
156 | NULL, (callback_job_cancel_t)cancel, JOB_PRIO_CRITICAL)); | |
b64f3336 | 157 | return TRUE; |
6dbce9c8 MW |
158 | } |
159 | ||
ec3b332b TB |
160 | /** |
161 | * Initialize/deinitialize NetworkManager backend | |
162 | */ | |
163 | static bool nm_backend_cb(void *plugin, | |
164 | plugin_feature_t *feature, bool reg, void *data) | |
165 | { | |
166 | if (reg) | |
167 | { | |
168 | return nm_backend_init(); | |
169 | } | |
170 | nm_backend_deinit(); | |
171 | return TRUE; | |
172 | } | |
173 | ||
174 | /* | |
175 | * see header file | |
176 | */ | |
177 | void nm_backend_register() | |
178 | { | |
179 | static plugin_feature_t features[] = { | |
180 | PLUGIN_CALLBACK((plugin_feature_callback_t)nm_backend_cb, NULL), | |
181 | PLUGIN_PROVIDE(CUSTOM, "NetworkManager backend"), | |
aa54ecef | 182 | PLUGIN_DEPENDS(CUSTOM, "libcharon"), |
1b33e6c4 TB |
183 | PLUGIN_SDEPEND(PRIVKEY, KEY_RSA), |
184 | PLUGIN_SDEPEND(PRIVKEY, KEY_ECDSA), | |
185 | PLUGIN_SDEPEND(CERT_DECODE, CERT_ANY), | |
186 | PLUGIN_SDEPEND(CERT_DECODE, CERT_X509), | |
ec3b332b TB |
187 | }; |
188 | lib->plugins->add_static_features(lib->plugins, "nm-backend", features, | |
5421092b | 189 | countof(features), TRUE, NULL, NULL); |
0619ddfa | 190 | } |