Annotation of embedaddon/strongswan/src/libcharon/bus/listeners/sys_logger.c, revision 1.1.1.2
1.1 misho 1: /*
1.1.1.2 ! misho 2: * Copyright (C) 2012-2020 Tobias Brunner
1.1 misho 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: /**
1.1.1.2 ! misho 54: * Print the log level
! 55: */
! 56: bool log_level;
! 57:
! 58: /**
1.1 misho 59: * Mutex to ensure multi-line log messages are not torn apart
60: */
61: mutex_t *mutex;
62:
63: /**
64: * Lock to read/write options (levels, ike_name)
65: */
66: rwlock_t *lock;
67: };
68:
69: METHOD(logger_t, log_, void,
70: private_sys_logger_t *this, debug_t group, level_t level, int thread,
71: ike_sa_t* ike_sa, const char *message)
72: {
1.1.1.2 ! misho 73: char groupstr[5], namestr[128] = "";
1.1 misho 74: const char *current = message, *next;
75:
76: /* cache group name and optional name string */
77: this->lock->read_lock(this->lock);
1.1.1.2 ! misho 78: if (this->log_level)
! 79: {
! 80: snprintf(groupstr, sizeof(groupstr), "%N%d", debug_names, group,
! 81: level);
! 82: }
! 83: else
! 84: {
! 85: snprintf(groupstr, sizeof(groupstr), "%N", debug_names, group);
! 86: }
! 87:
1.1 misho 88: if (this->ike_name && ike_sa)
89: {
90: if (ike_sa->get_peer_cfg(ike_sa))
91: {
92: snprintf(namestr, sizeof(namestr), " <%s|%d>",
93: ike_sa->get_name(ike_sa), ike_sa->get_unique_id(ike_sa));
94: }
95: else
96: {
97: snprintf(namestr, sizeof(namestr), " <%d>",
98: ike_sa->get_unique_id(ike_sa));
99: }
100: }
101: this->lock->unlock(this->lock);
102:
103: /* do a syslog for every line */
104: this->mutex->lock(this->mutex);
105: while (TRUE)
106: {
107: next = strchr(current, '\n');
108: if (next == NULL)
109: {
110: syslog(this->facility | LOG_INFO, "%.2d[%s]%s %s\n",
111: thread, groupstr, namestr, current);
112: break;
113: }
114: syslog(this->facility | LOG_INFO, "%.2d[%s]%s %.*s\n",
115: thread, groupstr, namestr, (int)(next - current), current);
116: current = next + 1;
117: }
118: this->mutex->unlock(this->mutex);
119: }
120:
121: METHOD(logger_t, get_level, level_t,
122: private_sys_logger_t *this, debug_t group)
123: {
124: level_t level;
125:
126: this->lock->read_lock(this->lock);
127: level = this->levels[group];
128: this->lock->unlock(this->lock);
129: return level;
130: }
131:
132: METHOD(sys_logger_t, set_level, void,
133: private_sys_logger_t *this, debug_t group, level_t level)
134: {
135: this->lock->write_lock(this->lock);
136: if (group < DBG_ANY)
137: {
138: this->levels[group] = level;
139: }
140: else
141: {
142: for (group = 0; group < DBG_MAX; group++)
143: {
144: this->levels[group] = level;
145: }
146: }
147: this->lock->unlock(this->lock);
148: }
149:
150: METHOD(sys_logger_t, set_options, void,
1.1.1.2 ! misho 151: private_sys_logger_t *this, bool ike_name, bool log_level)
1.1 misho 152: {
153: this->lock->write_lock(this->lock);
154: this->ike_name = ike_name;
1.1.1.2 ! misho 155: this->log_level = log_level;
1.1 misho 156: this->lock->unlock(this->lock);
157: }
158:
159: METHOD(sys_logger_t, destroy, void,
160: private_sys_logger_t *this)
161: {
162: this->lock->destroy(this->lock);
163: this->mutex->destroy(this->mutex);
164: free(this);
165: }
166:
167: /*
168: * Described in header.
169: */
170: sys_logger_t *sys_logger_create(int facility)
171: {
172: private_sys_logger_t *this;
173:
174: INIT(this,
175: .public = {
176: .logger = {
177: .log = _log_,
178: .get_level = _get_level,
179: },
180: .set_level = _set_level,
181: .set_options = _set_options,
182: .destroy = _destroy,
183: },
184: .facility = facility,
185: .mutex = mutex_create(MUTEX_TYPE_DEFAULT),
186: .lock = rwlock_create(RWLOCK_TYPE_DEFAULT),
187: );
188:
189: set_level(this, DBG_ANY, LEVEL_SILENT);
190: setlogmask(LOG_UPTO(LOG_INFO));
191:
192: return &this->public;
193: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>