]>
Commit | Line | Data |
---|---|---|
81582353 | 1 | /* |
5222c21d | 2 | * Copyright (c) 1999-2015 Apple Inc. All rights reserved. |
81582353 A |
3 | * |
4 | * @APPLE_LICENSE_HEADER_START@ | |
5 | * | |
6 | * This file contains Original Code and/or Modifications of Original Code | |
7 | * as defined in and that are subject to the Apple Public Source License | |
8 | * Version 2.0 (the 'License'). You may not use this file except in | |
9 | * compliance with the License. Please obtain a copy of the License at | |
10 | * http://www.opensource.apple.com/apsl/ and read it before using this | |
11 | * file. | |
12 | * | |
13 | * The Original Code and all software distributed under the License are | |
14 | * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER | |
15 | * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, | |
16 | * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, | |
17 | * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. | |
18 | * Please see the License for the specific language governing rights and | |
19 | * limitations under the License. | |
20 | * | |
21 | * @APPLE_LICENSE_HEADER_END@ | |
22 | */ | |
23 | ||
24 | /* | |
25 | * Copyright (c) 1993 | |
26 | * The Regents of the University of California. All rights reserved. | |
27 | * | |
28 | * Redistribution and use in source and binary forms, with or without | |
29 | * modification, are permitted provided that the following conditions | |
30 | * are met: | |
31 | * 1. Redistributions of source code must retain the above copyright | |
32 | * notice, this list of conditions and the following disclaimer. | |
33 | * 2. Redistributions in binary form must reproduce the above copyright | |
34 | * notice, this list of conditions and the following disclaimer in the | |
35 | * documentation and/or other materials provided with the distribution. | |
36 | * 3. All advertising materials mentioning features or use of this software | |
37 | * must display the following acknowledgement: | |
38 | * This product includes software developed by the University of | |
39 | * California, Berkeley and its contributors. | |
40 | * 4. Neither the name of the University nor the names of its contributors | |
41 | * may be used to endorse or promote products derived from this software | |
42 | * without specific prior written permission. | |
43 | * | |
44 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | |
45 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
46 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
47 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | |
48 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
49 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
50 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
51 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
52 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
53 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
54 | * SUCH DAMAGE. | |
55 | */ | |
56 | ||
f3df4c03 A |
57 | #include <stdio.h> |
58 | ||
81582353 A |
59 | #include <sys/syslog.h> |
60 | #include <stdlib.h> | |
61 | #include <string.h> | |
62 | #include <stdint.h> | |
797dbbb8 | 63 | #include <stdarg.h> |
81582353 A |
64 | #include <pthread.h> |
65 | #include <dispatch/dispatch.h> | |
66 | #include <asl.h> | |
f3df4c03 A |
67 | #include <asl_msg.h> |
68 | #include <asl_private.h> | |
af7d442c | 69 | #include <os/log.h> |
5222c21d | 70 | #include <os/log_private.h> |
81582353 | 71 | |
81582353 A |
72 | #define LOG_NO_NOTIFY 0x1000 |
73 | extern const char *asl_syslog_faciliy_num_to_name(int n); | |
74 | ||
75 | #ifdef BUILDING_VARIANT | |
76 | __private_extern__ pthread_mutex_t _sl_lock; | |
5222c21d | 77 | __private_extern__ asl_object_t _sl_asl; |
81582353 A |
78 | __private_extern__ char *_sl_ident; |
79 | __private_extern__ int _sl_fac; | |
80 | __private_extern__ int _sl_opts; | |
81 | __private_extern__ int _sl_mask; | |
82 | #else /* !BUILDING_VARIANT */ | |
83 | __private_extern__ pthread_mutex_t _sl_lock = PTHREAD_MUTEX_INITIALIZER; | |
5222c21d | 84 | __private_extern__ asl_object_t _sl_asl = NULL; |
81582353 A |
85 | __private_extern__ char *_sl_ident = NULL; |
86 | __private_extern__ int _sl_fac = 0; | |
87 | __private_extern__ int _sl_opts = 0; | |
88 | __private_extern__ int _sl_mask = 0; | |
89 | #endif /* BUILDING_VARIANT */ | |
90 | ||
5222c21d A |
91 | #define EVAL_ASL (EVAL_SEND_ASL | EVAL_TEXT_FILE | EVAL_ASL_FILE) |
92 | ||
af7d442c A |
93 | static const os_log_type_t shim_syslog_to_log_type[8] = { |
94 | OS_LOG_TYPE_DEFAULT, // LOG_EMERG | |
95 | OS_LOG_TYPE_DEFAULT, // LOG_ALERT | |
96 | OS_LOG_TYPE_DEFAULT, // LOG_CRIT | |
97 | OS_LOG_TYPE_DEFAULT, // LOG_ERR | |
98 | OS_LOG_TYPE_DEFAULT, // LOG_WARNING | |
99 | OS_LOG_TYPE_DEFAULT, // LOG_NOTICE | |
100 | OS_LOG_TYPE_INFO, // LOG_INFO | |
101 | OS_LOG_TYPE_DEBUG // LOG_DEBUG | |
5222c21d A |
102 | }; |
103 | ||
104 | extern uint32_t _asl_evaluate_send(asl_object_t client, asl_object_t m, int slevel); | |
105 | extern uint32_t _asl_lib_vlog(asl_object_t obj, uint32_t eval, asl_object_t msg, const char *format, va_list ap); | |
af7d442c | 106 | extern uint32_t _asl_lib_vlog_text(asl_object_t obj, uint32_t eval, asl_object_t msg, const char *format, va_list ap); |
5222c21d | 107 | |
797dbbb8 | 108 | static void |
5222c21d A |
109 | _syslog_asl_client() |
110 | { | |
111 | pthread_mutex_lock(&_sl_lock); | |
112 | if (_sl_asl == NULL) | |
113 | { | |
114 | _sl_asl = asl_open(NULL, NULL, ASL_OPT_SYSLOG_LEGACY); | |
115 | _sl_mask = ASL_FILTER_MASK_UPTO(ASL_LEVEL_DEBUG); | |
116 | asl_set_filter(_sl_asl, _sl_mask); | |
117 | } | |
118 | pthread_mutex_unlock(&_sl_lock); | |
5222c21d A |
119 | } |
120 | ||
797dbbb8 A |
121 | static void |
122 | _vsyslog(int pri, const char *fmt, va_list ap, void *addr, bool mirror) | |
5222c21d A |
123 | { |
124 | int level = pri & LOG_PRIMASK; | |
af7d442c | 125 | int fac = pri & LOG_FACMASK; |
797dbbb8 | 126 | asl_object_t msg; |
5222c21d | 127 | uint32_t eval; |
797dbbb8 | 128 | bool trace; |
af7d442c | 129 | |
5222c21d A |
130 | _syslog_asl_client(); |
131 | ||
797dbbb8 | 132 | msg = asl_new(ASL_TYPE_MSG); |
af7d442c | 133 | |
797dbbb8 A |
134 | if (fac != 0) |
135 | { | |
136 | const char *facility = asl_syslog_faciliy_num_to_name(fac); | |
137 | if (facility != NULL) asl_set(msg, ASL_KEY_FACILITY, facility); | |
af7d442c A |
138 | } |
139 | ||
797dbbb8 A |
140 | eval = _asl_evaluate_send(_sl_asl, msg, level); |
141 | trace = (eval & EVAL_SEND_TRACE) && os_log_shim_enabled(addr); | |
af7d442c | 142 | |
797dbbb8 | 143 | if (trace) |
5222c21d A |
144 | { |
145 | va_list ap_copy; | |
af7d442c | 146 | os_log_type_t type = shim_syslog_to_log_type[level]; |
5222c21d A |
147 | |
148 | va_copy(ap_copy, ap); | |
af7d442c | 149 | os_log_with_args(OS_LOG_DEFAULT, type, fmt, ap_copy, addr); |
5222c21d | 150 | va_end(ap_copy); |
af7d442c | 151 | |
797dbbb8 | 152 | if ((eval & EVAL_TEXT_FILE) && !mirror) |
af7d442c | 153 | { |
af7d442c | 154 | _asl_lib_vlog_text(_sl_asl, eval, msg, fmt, ap); |
af7d442c | 155 | } |
5222c21d | 156 | } |
af7d442c | 157 | |
797dbbb8 A |
158 | if ((eval & EVAL_ASL) && (mirror || !trace)) |
159 | { | |
5222c21d | 160 | _asl_lib_vlog(_sl_asl, eval, msg, fmt, ap); |
5222c21d | 161 | } |
af7d442c | 162 | |
797dbbb8 A |
163 | asl_release(msg); |
164 | } | |
af7d442c | 165 | |
797dbbb8 | 166 | #if TARGET_OS_OSX |
af7d442c | 167 | |
797dbbb8 A |
168 | extern typeof(syslog) syslog_legacy asm("_syslog"); |
169 | extern typeof(syslog) syslog_os_log asm("_syslog" __DARWIN_SUF_EXTSN); | |
af7d442c | 170 | |
797dbbb8 A |
171 | void |
172 | syslog_legacy(int pri, const char *fmt, ...) | |
173 | { | |
174 | va_list ap; | |
175 | va_start(ap, fmt); | |
176 | _vsyslog(pri, fmt, ap, __builtin_return_address(0), true); | |
177 | va_end(ap); | |
178 | } | |
af7d442c | 179 | |
797dbbb8 A |
180 | void |
181 | syslog_os_log(int pri, const char *fmt, ...) | |
182 | { | |
183 | va_list ap; | |
184 | va_start(ap, fmt); | |
185 | _vsyslog(pri, fmt, ap, __builtin_return_address(0), false); | |
186 | va_end(ap); | |
187 | } | |
af7d442c | 188 | |
797dbbb8 | 189 | #else /* !TARGET_OS_OSX */ |
5222c21d | 190 | |
797dbbb8 A |
191 | void |
192 | syslog(int pri, const char *fmt, ...) | |
193 | { | |
194 | va_list ap; | |
195 | va_start(ap, fmt); | |
196 | _vsyslog(pri, fmt, ap, __builtin_return_address(0), false); | |
197 | va_end(ap); | |
198 | } | |
af7d442c | 199 | |
797dbbb8 | 200 | #endif /* !TARGET_OS_OSX */ |
af7d442c | 201 | |
797dbbb8 A |
202 | void |
203 | vsyslog(int pri, const char *fmt, va_list ap) | |
204 | { | |
205 | _vsyslog(pri, fmt, ap, __builtin_return_address(0), false); | |
81582353 A |
206 | } |
207 | ||
208 | #ifndef BUILDING_VARIANT | |
209 | ||
210 | void | |
211 | openlog(const char *ident, int opts, int logfac) | |
212 | { | |
213 | const char *facility; | |
214 | uint32_t asl_opts; | |
215 | ||
216 | pthread_mutex_lock(&_sl_lock); | |
217 | ||
5222c21d | 218 | if (_sl_asl != NULL) asl_release(_sl_asl); |
81582353 A |
219 | _sl_asl = NULL; |
220 | ||
221 | free(_sl_ident); | |
222 | _sl_ident = NULL; | |
223 | ||
224 | /* open with specified parameters */ | |
225 | ||
226 | if (ident != NULL) _sl_ident = strdup(ident); | |
227 | /* NB we allow the strdup to fail silently */ | |
228 | ||
229 | _sl_fac = logfac; | |
230 | facility = asl_syslog_faciliy_num_to_name(_sl_fac); | |
231 | ||
232 | _sl_opts = opts; | |
233 | asl_opts = ASL_OPT_SYSLOG_LEGACY; | |
234 | ||
235 | if (_sl_opts & LOG_NO_NOTIFY) asl_opts |= ASL_OPT_NO_REMOTE; | |
236 | if (_sl_opts & LOG_PERROR) asl_opts |= ASL_OPT_STDERR; | |
237 | ||
238 | _sl_mask = ASL_FILTER_MASK_UPTO(ASL_LEVEL_DEBUG); | |
239 | ||
240 | _sl_asl = asl_open(_sl_ident, facility, asl_opts); | |
241 | asl_set_filter(_sl_asl, _sl_mask); | |
242 | ||
243 | pthread_mutex_unlock(&_sl_lock); | |
244 | } | |
245 | ||
246 | void | |
247 | closelog() | |
248 | { | |
249 | pthread_mutex_lock(&_sl_lock); | |
250 | ||
251 | if (_sl_asl != NULL) asl_close(_sl_asl); | |
252 | _sl_asl = NULL; | |
253 | ||
f3df4c03 | 254 | free(_sl_ident); |
81582353 A |
255 | _sl_ident = NULL; |
256 | ||
af7d442c A |
257 | _sl_fac = 0; |
258 | ||
81582353 A |
259 | pthread_mutex_unlock(&_sl_lock); |
260 | } | |
261 | ||
262 | /* setlogmask -- set the log mask level */ | |
263 | int | |
264 | setlogmask(int mask) | |
265 | { | |
266 | int oldmask; | |
267 | ||
268 | if (mask == 0) return _sl_mask; | |
269 | ||
270 | pthread_mutex_lock(&_sl_lock); | |
271 | ||
272 | _sl_mask = mask; | |
273 | oldmask = asl_set_filter(_sl_asl, mask); | |
f3df4c03 | 274 | if (_sl_opts & LOG_PERROR) asl_set_output_file_filter(_sl_asl, STDERR_FILENO, mask); |
81582353 A |
275 | |
276 | pthread_mutex_unlock(&_sl_lock); | |
277 | ||
278 | return oldmask; | |
279 | } | |
280 | ||
281 | #endif /* !BUILDING_VARIANT */ |