Annotation of embedaddon/strongswan/src/libtnccs/tnc/tnc.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2011 Andreas Steffen
                      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: #define _GNU_SOURCE /* for stdndup() */
                     17: #include <sys/types.h>
                     18: #include <sys/stat.h>
                     19: #include <unistd.h>
                     20: #include <errno.h>
                     21: #include <fcntl.h>
                     22: #include <string.h>
                     23: 
                     24: #include "tnc.h"
                     25: 
                     26: #include <utils/lexparser.h>
                     27: #include <utils/debug.h>
                     28: 
                     29: #ifdef WIN32
                     30: # define DEFAULT_TNC_CONFIG "tnc_config"
                     31: #else
                     32: # define DEFAULT_TNC_CONFIG "/etc/tnc_config"
                     33: #endif
                     34: 
                     35: typedef struct private_tnc_t private_tnc_t;
                     36: 
                     37: typedef tnccs_manager_t *(*tnc_create_tnccs_manager_t)(void);
                     38: typedef imc_manager_t *(*tnc_create_imc_manager_t)(void);
                     39: typedef imv_manager_t *(*tnc_create_imv_manager_t)(void);
                     40: 
                     41: /**
                     42:  * Private additions to tnc_t.
                     43:  */
                     44: struct private_tnc_t {
                     45: 
                     46:        /**
                     47:         * Public members of tnc_t.
                     48:         */
                     49:        tnc_t public;
                     50: 
                     51:        /**
                     52:         * Number of times we have been initialized
                     53:         */
                     54:        refcount_t ref;
                     55: };
                     56: 
                     57: /**
                     58:  * Register plugins if built statically
                     59:  */
                     60: #ifdef STATIC_PLUGIN_CONSTRUCTORS
                     61: #include "plugin_constructors.c"
                     62: #endif
                     63: 
                     64: /**
                     65:  * Single instance of tnc_t.
                     66:  */
                     67: tnc_t *tnc;
                     68: 
                     69: /**
                     70:  * Described in header.
                     71:  */
                     72: void libtnccs_init(void)
                     73: {
                     74:        private_tnc_t *this;
                     75: 
                     76:        if (tnc)
                     77:        {       /* already initialized, increase refcount */
                     78:                this = (private_tnc_t*)tnc;
                     79:                ref_get(&this->ref);
                     80:                return;
                     81:        }
                     82: 
                     83:        INIT(this,
                     84:                .public = {
                     85:                },
                     86:                .ref = 1,
                     87:        );
                     88:        tnc = &this->public;
                     89:        lib->settings->add_fallback(lib->settings, "%s.tnc", "libtnccs", lib->ns);
                     90:        lib->settings->add_fallback(lib->settings, "%s.plugins", "libtnccs.plugins",
                     91:                                                                lib->ns);
                     92: }
                     93: 
                     94: /**
                     95:  * Described in header.
                     96:  */
                     97: void libtnccs_deinit(void)
                     98: {
                     99:        private_tnc_t *this = (private_tnc_t*)tnc;
                    100: 
                    101:        if (!this || !ref_put(&this->ref))
                    102:        {       /* have more users */
                    103:                return;
                    104:        }
                    105: 
                    106:        free(this);
                    107:        tnc = NULL;
                    108: }
                    109: 
                    110: static bool load_imcvs_from_config(char *filename, bool is_imc)
                    111: {
                    112:        bool success = FALSE;
                    113:        int line_nr = 0;
                    114:        chunk_t *src, line;
                    115:        char *label;
                    116: 
                    117:        if (!filename || !*filename)
                    118:        {
                    119:                return TRUE;
                    120:        }
                    121: 
                    122:        label = is_imc ? "IMC" : "IMV";
                    123: 
                    124:        DBG1(DBG_TNC, "loading %ss from '%s'", label, filename);
                    125:        src = chunk_map(filename, FALSE);
                    126:        if (!src)
                    127:        {
                    128:                DBG1(DBG_TNC, "opening configuration file '%s' failed: %s", filename,
                    129:                         strerror(errno));
                    130:                return FALSE;
                    131:        }
                    132: 
                    133:        while (fetchline(src, &line))
                    134:        {
                    135:                char *name, *path;
                    136:                chunk_t token;
                    137: 
                    138:                line_nr++;
                    139: 
                    140:                /* skip comments or empty lines */
                    141:                if (*line.ptr == '#' || !eat_whitespace(&line))
                    142:                {
                    143:                        continue;
                    144:                }
                    145: 
                    146:                /* determine keyword */
                    147:                if (!extract_token(&token, ' ', &line))
                    148:                {
                    149:                        DBG1(DBG_TNC, "line %d: keyword must be followed by a space",
                    150:                                                   line_nr);
                    151:                        break;
                    152:                }
                    153: 
                    154:                /* only interested in IMCs or IMVs depending on label */
                    155:                if (!match(label, &token))
                    156:                {
                    157:                        continue;
                    158:                }
                    159: 
                    160:                /* advance to the IMC/IMV name and extract it */
                    161:                if (!extract_token(&token, '"', &line) ||
                    162:                        !extract_token(&token, '"', &line))
                    163:                {
                    164:                        DBG1(DBG_TNC, "line %d: %s name must be set in double quotes",
                    165:                                                   line_nr, label);
                    166:                        break;
                    167:                }
                    168: 
                    169:                /* copy the IMC/IMV name */
                    170:                name = strndup(token.ptr, token.len);
                    171: 
                    172:                /* advance to the IMC/IMV path and extract it */
                    173:                if (!eat_whitespace(&line))
                    174:                {
                    175:                        DBG1(DBG_TNC, "line %d: %s path is missing", line_nr, label);
                    176:                        free(name);
                    177:                        break;
                    178:                }
                    179:                if (!extract_token(&token, ' ', &line))
                    180:                {
                    181:                        token = line;
                    182:                }
                    183: 
                    184:                /* copy the IMC/IMV path */
                    185:                path = strndup(token.ptr, token.len);
                    186: 
                    187:                /* load and register an IMC/IMV instance */
                    188:                if (is_imc)
                    189:                {
                    190:                        success = tnc->imcs->load(tnc->imcs, name, path);
                    191:                }
                    192:                else
                    193:                {
                    194:                        success = tnc->imvs->load(tnc->imvs, name, path);
                    195:                }
                    196:                free(name);
                    197:                free(path);
                    198:                if (!success)
                    199:                {
                    200:                        break;
                    201:                }
                    202:        }
                    203:        chunk_unmap(src);
                    204:        return success;
                    205: }
                    206: 
                    207: /**
                    208:  * Described in header.
                    209:  */
                    210: bool tnc_manager_register(plugin_t *plugin, plugin_feature_t *feature,
                    211:                                                  bool reg, void *data)
                    212: {
                    213:        bool load_imcvs = FALSE;
                    214:        bool is_imc = FALSE;
                    215: 
                    216:        if (feature->type == FEATURE_CUSTOM)
                    217:        {
                    218:                if (streq(feature->arg.custom, "tnccs-manager"))
                    219:                {
                    220:                        if (reg)
                    221:                        {
                    222:                                tnc->tnccs = ((tnc_create_tnccs_manager_t)data)();
                    223:                        }
                    224:                        else
                    225:                        {
                    226:                                tnc->tnccs->destroy(tnc->tnccs);
                    227:                                tnc->tnccs = NULL;
                    228:                        }
                    229:                }
                    230:                else if (streq(feature->arg.custom, "imc-manager"))
                    231:                {
                    232:                        if (reg)
                    233:                        {
                    234:                                tnc->imcs = ((tnc_create_imc_manager_t)data)();
                    235:                                is_imc = TRUE;
                    236:                                load_imcvs = TRUE;
                    237:                        }
                    238:                        else
                    239:                        {
                    240:                                tnc->imcs->destroy(tnc->imcs);
                    241:                                tnc->imcs = NULL;
                    242:                        }
                    243:                }
                    244:                else if (streq(feature->arg.custom, "imv-manager"))
                    245:                {
                    246:                        if (reg)
                    247:                        {
                    248:                                tnc->imvs = ((tnc_create_imv_manager_t)data)();
                    249:                                is_imc = FALSE;
                    250:                                load_imcvs = TRUE;
                    251:                        }
                    252:                        else
                    253:                        {
                    254:                                tnc->imvs->destroy(tnc->imvs);
                    255:                                tnc->imvs = NULL;
                    256:                        }
                    257:                }
                    258:                else
                    259:                {
                    260:                        return FALSE;
                    261:                }
                    262: 
                    263:                if (load_imcvs)
                    264:                {
                    265:                        load_imcvs_from_config(
                    266:                                                lib->settings->get_str(lib->settings,
                    267:                                                        "%s.tnc.tnc_config", DEFAULT_TNC_CONFIG, lib->ns),
                    268:                                                is_imc);
                    269:                }
                    270:        }
                    271:        return TRUE;
                    272: }

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