#include <asl.h>
#include <asl_msg.h>
#include <asl_private.h>
-#include <os/trace.h>
+#include <os/log.h>
#include <os/log_private.h>
#ifdef __STDC__
#define EVAL_ASL (EVAL_SEND_ASL | EVAL_TEXT_FILE | EVAL_ASL_FILE)
-static const uint8_t shim_syslog_to_trace_type[8] = {
- OS_TRACE_TYPE_FAULT, OS_TRACE_TYPE_FAULT, OS_TRACE_TYPE_FAULT, // LOG_EMERG, LOG_ALERT, LOG_CRIT
- OS_TRACE_TYPE_ERROR, // LOG_ERROR
- OS_TRACE_TYPE_RELEASE, OS_TRACE_TYPE_RELEASE, OS_TRACE_TYPE_RELEASE, // LOG_WARN, LOG_NOTICE, LOG_INFO
- OS_TRACE_TYPE_DEBUG // LOG_DEBUG
+static const os_log_type_t shim_syslog_to_log_type[8] = {
+ OS_LOG_TYPE_DEFAULT, // LOG_EMERG
+ OS_LOG_TYPE_DEFAULT, // LOG_ALERT
+ OS_LOG_TYPE_DEFAULT, // LOG_CRIT
+ OS_LOG_TYPE_DEFAULT, // LOG_ERR
+ OS_LOG_TYPE_DEFAULT, // LOG_WARNING
+ OS_LOG_TYPE_DEFAULT, // LOG_NOTICE
+ OS_LOG_TYPE_INFO, // LOG_INFO
+ OS_LOG_TYPE_DEBUG // LOG_DEBUG
};
extern uint32_t _asl_evaluate_send(asl_object_t client, asl_object_t m, int slevel);
extern uint32_t _asl_lib_vlog(asl_object_t obj, uint32_t eval, asl_object_t msg, const char *format, va_list ap);
+extern uint32_t _asl_lib_vlog_text(asl_object_t obj, uint32_t eval, asl_object_t msg, const char *format, va_list ap);
/* SHIM SPI */
vsyslog(int pri, const char *fmt, va_list ap)
{
int level = pri & LOG_PRIMASK;
+ int fac = pri & LOG_FACMASK;
uint32_t eval;
-
+ void *addr;
+
_syslog_asl_client();
eval = _asl_evaluate_send(_sl_asl, NULL, level);
-
- if (eval & EVAL_SEND_TRACE)
+
+ /* don't send install messages to Activity Tracing */
+ if (fac == LOG_INSTALL || (fac == 0 && _sl_fac == LOG_INSTALL)) {
+ eval &= ~EVAL_SEND_TRACE;
+ }
+
+ addr = __builtin_return_address(0);
+
+ if ((eval & EVAL_SEND_TRACE) && os_log_shim_enabled(addr))
{
va_list ap_copy;
- uint8_t trace_type = shim_syslog_to_trace_type[level];
+ os_log_type_t type = shim_syslog_to_log_type[level];
va_copy(ap_copy, ap);
- os_log_shim_with_va_list(__builtin_return_address(0), OS_LOG_DEFAULT, trace_type, fmt, ap_copy, NULL);
+ os_log_with_args(OS_LOG_DEFAULT, type, fmt, ap_copy, addr);
va_end(ap_copy);
+
+ if (eval & EVAL_TEXT_FILE)
+ {
+ asl_object_t msg = asl_new(ASL_TYPE_MSG);
+ const char *facility;
+
+ if (fac != 0)
+ {
+ facility = asl_syslog_faciliy_num_to_name(fac);
+ if (facility != NULL) asl_set(msg, ASL_KEY_FACILITY, facility);
+ }
+
+ _asl_lib_vlog_text(_sl_asl, eval, msg, fmt, ap);
+
+ asl_release(msg);
+ }
}
-
- if (os_log_shim_legacy_logging_enabled() && (eval & EVAL_ASL))
+ else if (eval & EVAL_ASL)
{
asl_object_t msg = asl_new(ASL_TYPE_MSG);
const char *facility;
- int fac = pri & LOG_FACMASK;
-
+
if (fac != 0)
{
facility = asl_syslog_faciliy_num_to_name(fac);
if (facility != NULL) asl_set(msg, ASL_KEY_FACILITY, facility);
}
-
- if (eval & EVAL_SEND_TRACE) asl_set(msg, "ASLSHIM", "2");
-
+
_asl_lib_vlog(_sl_asl, eval, msg, fmt, ap);
-
+
asl_release(msg);
}
}
#endif
{
int level = pri & LOG_PRIMASK;
+ int fac = pri & LOG_FACMASK;
uint32_t eval;
-
+ void *addr;
+
_syslog_asl_client();
eval = _asl_evaluate_send(_sl_asl, NULL, level);
-
- if (eval & EVAL_SEND_TRACE)
+
+ /* don't send install messages to Activity Tracing */
+ if (fac == LOG_INSTALL || (fac == 0 && _sl_fac == LOG_INSTALL)) {
+ eval &= ~EVAL_SEND_TRACE;
+ }
+
+ addr = __builtin_return_address(0);
+
+ if ((eval & EVAL_SEND_TRACE) && os_log_shim_enabled(addr))
{
va_list ap;
- uint8_t trace_type = shim_syslog_to_trace_type[level];
-
+ os_log_type_t type = shim_syslog_to_log_type[level];
+
#ifdef __STDC__
va_start(ap, fmt);
#else
va_start(ap);
#endif
- os_log_shim_with_va_list(__builtin_return_address(0), OS_LOG_DEFAULT, trace_type, fmt, ap, NULL);
+ os_log_with_args(OS_LOG_DEFAULT, type, fmt, ap, addr);
va_end(ap);
+
+ if (eval & EVAL_TEXT_FILE)
+ {
+ va_list ap;
+ asl_object_t msg = asl_new(ASL_TYPE_MSG);
+ const char *facility;
+
+ if (fac != 0)
+ {
+ facility = asl_syslog_faciliy_num_to_name(fac);
+ if (facility != NULL) asl_set(msg, ASL_KEY_FACILITY, facility);
+ }
+
+#ifdef __STDC__
+ va_start(ap, fmt);
+#else
+ va_start(ap);
+#endif
+ _asl_lib_vlog_text(_sl_asl, eval, msg, fmt, ap);
+ va_end(ap);
+
+ asl_release(msg);
+ }
}
-
- if (os_log_shim_legacy_logging_enabled() && (eval & EVAL_ASL))
+ else if (eval & EVAL_ASL)
{
va_list ap;
asl_object_t msg = asl_new(ASL_TYPE_MSG);
const char *facility;
- int fac = pri & LOG_FACMASK;
if (fac != 0)
{
facility = asl_syslog_faciliy_num_to_name(fac);
if (facility != NULL) asl_set(msg, ASL_KEY_FACILITY, facility);
}
-
- if (eval & EVAL_SEND_TRACE) asl_set(msg, "ASLSHIM", "2");
-
+
#ifdef __STDC__
va_start(ap, fmt);
#else
#endif
_asl_lib_vlog(_sl_asl, eval, msg, fmt, ap);
va_end(ap);
-
+
asl_release(msg);
}
}
free(_sl_ident);
_sl_ident = NULL;
+ _sl_fac = 0;
+
pthread_mutex_unlock(&_sl_lock);
}