Annotation of embedaddon/strongswan/src/libcharon/plugins/medcli/medcli_listener.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2008 Martin Willi
                      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: #include "medcli_listener.h"
                     17: 
                     18: #include <daemon.h>
                     19: #include <library.h>
                     20: 
                     21: typedef struct private_medcli_listener_t private_medcli_listener_t;
                     22: typedef enum mediated_state_t mediated_state_t;
                     23: 
                     24: /**
                     25:  * state of a mediated connection
                     26:  */
                     27: enum mediated_state_t {
                     28:        STATE_DOWN = 1,
                     29:        STATE_CONNECTING = 2,
                     30:        STATE_UP = 3,
                     31: };
                     32: 
                     33: /**
                     34:  * Private data of an medcli_listener_t object
                     35:  */
                     36: struct private_medcli_listener_t {
                     37: 
                     38:        /**
                     39:         * Public part
                     40:         */
                     41:        medcli_listener_t public;
                     42: 
                     43:        /**
                     44:         * underlying database handle
                     45:         */
                     46:        database_t *db;
                     47: };
                     48: 
                     49: /**
                     50:  * Update connection status in the database
                     51:  */
                     52: static void set_state(private_medcli_listener_t *this, char *alias,
                     53:                                          mediated_state_t state)
                     54: {
                     55:        this->db->execute(this->db, NULL,
                     56:                                          "UPDATE Connection SET Status = ? WHERE Alias = ?",
                     57:                                          DB_UINT, state, DB_TEXT, alias);
                     58: }
                     59: 
                     60: METHOD(listener_t, ike_state_change, bool,
                     61:        private_medcli_listener_t *this, ike_sa_t *ike_sa, ike_sa_state_t state)
                     62: {
                     63:        if (ike_sa)
                     64:        {
                     65:                switch (state)
                     66:                {
                     67:                        case IKE_CONNECTING:
                     68:                                set_state(this, ike_sa->get_name(ike_sa), STATE_CONNECTING);
                     69:                                break;
                     70:                        case IKE_DESTROYING:
                     71:                                set_state(this, ike_sa->get_name(ike_sa), STATE_DOWN);
                     72:                        default:
                     73:                                break;
                     74:                }
                     75:        }
                     76:        return TRUE;
                     77: }
                     78: 
                     79: METHOD(listener_t, child_state_change, bool,
                     80:        private_medcli_listener_t *this, ike_sa_t *ike_sa, child_sa_t *child_sa,
                     81:        child_sa_state_t state)
                     82: {
                     83:        if (ike_sa && child_sa)
                     84:        {
                     85:                switch (state)
                     86:                {
                     87:                        case CHILD_INSTALLED:
                     88:                                set_state(this, child_sa->get_name(child_sa), STATE_UP);
                     89:                                break;
                     90:                        case CHILD_DESTROYING:
                     91:                                set_state(this, child_sa->get_name(child_sa), STATE_DOWN);
                     92:                                break;
                     93:                        default:
                     94:                                break;
                     95:                }
                     96:        }
                     97:        return TRUE;
                     98: }
                     99: 
                    100: METHOD(medcli_listener_t, destroy, void,
                    101:        private_medcli_listener_t *this)
                    102: {
                    103:        this->db->execute(this->db, NULL, "UPDATE Connection SET Status = ?",
                    104:                                          DB_UINT, STATE_DOWN);
                    105:        free(this);
                    106: }
                    107: 
                    108: /**
                    109:  * Described in header.
                    110:  */
                    111: medcli_listener_t *medcli_listener_create(database_t *db)
                    112: {
                    113:        private_medcli_listener_t *this;
                    114: 
                    115:        INIT(this,
                    116:                .public = {
                    117:                        .listener = {
                    118:                                .ike_state_change = _ike_state_change,
                    119:                                .child_state_change = _child_state_change,
                    120:                        },
                    121:                        .destroy = _destroy,
                    122:                },
                    123:                .db = db,
                    124:        );
                    125: 
                    126:        db->execute(db, NULL, "UPDATE Connection SET Status = ?",
                    127:                                DB_UINT, STATE_DOWN);
                    128: 
                    129:        return &this->public;
                    130: }
                    131: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>