Annotation of embedaddon/strongswan/src/libstrongswan/credentials/sets/callback_cred.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * Copyright (C) 2010 Martin Willi
        !             3:  * Copyright (C) 2010 revosec AG
        !             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 "callback_cred.h"
        !            17: 
        !            18: typedef struct private_callback_cred_t private_callback_cred_t;
        !            19: 
        !            20: /**
        !            21:  * Private data of an callback_cred_t object.
        !            22:  */
        !            23: struct private_callback_cred_t {
        !            24: 
        !            25:        /**
        !            26:         * Public callback_cred_t interface.
        !            27:         */
        !            28:        callback_cred_t public;
        !            29: 
        !            30:        /**
        !            31:         * Callback of this set, for all types, and generic
        !            32:         */
        !            33:        union {
        !            34:                void *generic;
        !            35:                callback_cred_shared_cb_t shared;
        !            36:        } cb;
        !            37: 
        !            38:        /**
        !            39:         * Data to pass to callback
        !            40:         */
        !            41:        void *data;
        !            42: };
        !            43: 
        !            44: /**
        !            45:  * Shared key enumerator on callbacks
        !            46:  */
        !            47: typedef struct {
        !            48:        /* implements enumerator_t */
        !            49:        enumerator_t public;
        !            50:        /* backref to this */
        !            51:        private_callback_cred_t *this;
        !            52:        /* type if requested key */
        !            53:        shared_key_type_t type;
        !            54:        /* own identity to match */
        !            55:        identification_t *me;
        !            56:        /* other identity to match */
        !            57:        identification_t *other;
        !            58:        /* current shared key */
        !            59:        shared_key_t *current;
        !            60: } shared_enumerator_t;
        !            61: 
        !            62: METHOD(enumerator_t, shared_enumerate, bool,
        !            63:        shared_enumerator_t *this, va_list args)
        !            64: {
        !            65:        shared_key_t **out;
        !            66:        id_match_t *match_me, *match_other;
        !            67: 
        !            68:        VA_ARGS_VGET(args, out, match_me, match_other);
        !            69:        DESTROY_IF(this->current);
        !            70:        this->current = this->this->cb.shared(this->this->data, this->type,
        !            71:                                                                this->me, this->other, match_me, match_other);
        !            72:        if (this->current)
        !            73:        {
        !            74:                *out = this->current;
        !            75:                return TRUE;
        !            76:        }
        !            77:        return FALSE;
        !            78: }
        !            79: 
        !            80: METHOD(enumerator_t, shared_destroy, void,
        !            81:        shared_enumerator_t *this)
        !            82: {
        !            83:        DESTROY_IF(this->current);
        !            84:        free(this);
        !            85: }
        !            86: 
        !            87: METHOD(credential_set_t, create_shared_enumerator, enumerator_t*,
        !            88:        private_callback_cred_t *this, shared_key_type_t type,
        !            89:        identification_t *me, identification_t *other)
        !            90: {
        !            91:        shared_enumerator_t *enumerator;
        !            92: 
        !            93:        INIT(enumerator,
        !            94:                .public = {
        !            95:                        .enumerate = enumerator_enumerate_default,
        !            96:                        .venumerate = _shared_enumerate,
        !            97:                        .destroy = _shared_destroy,
        !            98:                },
        !            99:                .this = this,
        !           100:                .type = type,
        !           101:                .me = me,
        !           102:                .other = other,
        !           103:        );
        !           104:        return &enumerator->public;
        !           105: }
        !           106: 
        !           107: METHOD(callback_cred_t, destroy, void,
        !           108:        private_callback_cred_t *this)
        !           109: {
        !           110:        free(this);
        !           111: }
        !           112: 
        !           113: /**
        !           114:  * Create a generic callback credential set
        !           115:  */
        !           116: static private_callback_cred_t* create_generic(void *cb, void *data)
        !           117: {
        !           118:        private_callback_cred_t *this;
        !           119: 
        !           120:        INIT(this,
        !           121:                .public = {
        !           122:                        .set = {
        !           123:                                .create_shared_enumerator = (void*)return_null,
        !           124:                                .create_private_enumerator = (void*)return_null,
        !           125:                                .create_cert_enumerator = (void*)return_null,
        !           126:                                .create_cdp_enumerator  = (void*)return_null,
        !           127:                                .cache_cert = (void*)nop,
        !           128:                        },
        !           129:                        .destroy = _destroy,
        !           130:                },
        !           131:                .cb.generic = cb,
        !           132:                .data = data,
        !           133:        );
        !           134:        return this;
        !           135: }
        !           136: 
        !           137: /**
        !           138:  * See header
        !           139:  */
        !           140: callback_cred_t *callback_cred_create_shared(callback_cred_shared_cb_t cb,
        !           141:                                                                                         void *data)
        !           142: {
        !           143:        private_callback_cred_t *this = create_generic(cb, data);
        !           144: 
        !           145:        this->public.set.create_shared_enumerator = _create_shared_enumerator;
        !           146: 
        !           147:        return &this->public;
        !           148: }

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