Annotation of embedaddon/strongswan/src/libcharon/bus/listeners/sys_logger.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2012 Tobias Brunner
                      3:  * Copyright (C) 2006 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 <stdio.h>
                     18: #include <string.h>
                     19: #include <syslog.h>
                     20: 
                     21: #include "sys_logger.h"
                     22: 
                     23: #include <threading/mutex.h>
                     24: #include <threading/rwlock.h>
                     25: 
                     26: typedef struct private_sys_logger_t private_sys_logger_t;
                     27: 
                     28: /**
                     29:  * Private data of a sys_logger_t object
                     30:  */
                     31: struct private_sys_logger_t {
                     32: 
                     33:        /**
                     34:         * Public data.
                     35:         */
                     36:        sys_logger_t public;
                     37: 
                     38:        /**
                     39:         * syslog facility to use
                     40:         */
                     41:        int facility;
                     42: 
                     43:        /**
                     44:         * Maximum level to log, for each group
                     45:         */
                     46:        level_t levels[DBG_MAX];
                     47: 
                     48:        /**
                     49:         * Print the name/# of the IKE_SA?
                     50:         */
                     51:        bool ike_name;
                     52: 
                     53:        /**
                     54:         * Mutex to ensure multi-line log messages are not torn apart
                     55:         */
                     56:        mutex_t *mutex;
                     57: 
                     58:        /**
                     59:         * Lock to read/write options (levels, ike_name)
                     60:         */
                     61:        rwlock_t *lock;
                     62: };
                     63: 
                     64: METHOD(logger_t, log_, void,
                     65:        private_sys_logger_t *this, debug_t group, level_t level, int thread,
                     66:        ike_sa_t* ike_sa, const char *message)
                     67: {
                     68:        char groupstr[4], namestr[128] = "";
                     69:        const char *current = message, *next;
                     70: 
                     71:        /* cache group name and optional name string */
                     72:        snprintf(groupstr, sizeof(groupstr), "%N", debug_names, group);
                     73: 
                     74:        this->lock->read_lock(this->lock);
                     75:        if (this->ike_name && ike_sa)
                     76:        {
                     77:                if (ike_sa->get_peer_cfg(ike_sa))
                     78:                {
                     79:                        snprintf(namestr, sizeof(namestr), " <%s|%d>",
                     80:                                ike_sa->get_name(ike_sa), ike_sa->get_unique_id(ike_sa));
                     81:                }
                     82:                else
                     83:                {
                     84:                        snprintf(namestr, sizeof(namestr), " <%d>",
                     85:                                ike_sa->get_unique_id(ike_sa));
                     86:                }
                     87:        }
                     88:        this->lock->unlock(this->lock);
                     89: 
                     90:        /* do a syslog for every line */
                     91:        this->mutex->lock(this->mutex);
                     92:        while (TRUE)
                     93:        {
                     94:                next = strchr(current, '\n');
                     95:                if (next == NULL)
                     96:                {
                     97:                        syslog(this->facility | LOG_INFO, "%.2d[%s]%s %s\n",
                     98:                                   thread, groupstr, namestr, current);
                     99:                        break;
                    100:                }
                    101:                syslog(this->facility | LOG_INFO, "%.2d[%s]%s %.*s\n",
                    102:                           thread, groupstr, namestr, (int)(next - current), current);
                    103:                current = next + 1;
                    104:        }
                    105:        this->mutex->unlock(this->mutex);
                    106: }
                    107: 
                    108: METHOD(logger_t, get_level, level_t,
                    109:        private_sys_logger_t *this, debug_t group)
                    110: {
                    111:        level_t level;
                    112: 
                    113:        this->lock->read_lock(this->lock);
                    114:        level = this->levels[group];
                    115:        this->lock->unlock(this->lock);
                    116:        return level;
                    117: }
                    118: 
                    119: METHOD(sys_logger_t, set_level, void,
                    120:        private_sys_logger_t *this, debug_t group, level_t level)
                    121: {
                    122:        this->lock->write_lock(this->lock);
                    123:        if (group < DBG_ANY)
                    124:        {
                    125:                this->levels[group] = level;
                    126:        }
                    127:        else
                    128:        {
                    129:                for (group = 0; group < DBG_MAX; group++)
                    130:                {
                    131:                        this->levels[group] = level;
                    132:                }
                    133:        }
                    134:        this->lock->unlock(this->lock);
                    135: }
                    136: 
                    137: METHOD(sys_logger_t, set_options, void,
                    138:        private_sys_logger_t *this, bool ike_name)
                    139: {
                    140:        this->lock->write_lock(this->lock);
                    141:        this->ike_name = ike_name;
                    142:        this->lock->unlock(this->lock);
                    143: }
                    144: 
                    145: METHOD(sys_logger_t, destroy, void,
                    146:        private_sys_logger_t *this)
                    147: {
                    148:        this->lock->destroy(this->lock);
                    149:        this->mutex->destroy(this->mutex);
                    150:        free(this);
                    151: }
                    152: 
                    153: /*
                    154:  * Described in header.
                    155:  */
                    156: sys_logger_t *sys_logger_create(int facility)
                    157: {
                    158:        private_sys_logger_t *this;
                    159: 
                    160:        INIT(this,
                    161:                .public = {
                    162:                        .logger = {
                    163:                                .log = _log_,
                    164:                                .get_level = _get_level,
                    165:                        },
                    166:                        .set_level = _set_level,
                    167:                        .set_options = _set_options,
                    168:                        .destroy = _destroy,
                    169:                },
                    170:                .facility = facility,
                    171:                .mutex = mutex_create(MUTEX_TYPE_DEFAULT),
                    172:                .lock = rwlock_create(RWLOCK_TYPE_DEFAULT),
                    173:        );
                    174: 
                    175:        set_level(this, DBG_ANY, LEVEL_SILENT);
                    176:        setlogmask(LOG_UPTO(LOG_INFO));
                    177: 
                    178:        return &this->public;
                    179: }

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