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>