Annotation of embedaddon/strongswan/src/charon-nm/nm/nm_backend.c, revision 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>