]> git.saurik.com Git - apple/syslog.git/blobdiff - libsystem_asl.tproj/src/syslog.c
syslog-349.1.1.tar.gz
[apple/syslog.git] / libsystem_asl.tproj / src / syslog.c
index 1975d4d2b699756086cbe4d05e87e3e810a66288..ae0c402f15ef137da7ec8e8790d69f8992d87348 100644 (file)
@@ -65,7 +65,7 @@
 #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__
@@ -95,15 +95,20 @@ __private_extern__ int _sl_mask = 0;
 
 #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 */
@@ -131,38 +136,59 @@ void
 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);
        }
 }
@@ -178,41 +204,69 @@ va_dcl
 #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
@@ -220,7 +274,7 @@ va_dcl
 #endif
                _asl_lib_vlog(_sl_asl, eval, msg, fmt, ap);
                va_end(ap);
-               
+
                asl_release(msg);
        }
 }
@@ -274,6 +328,8 @@ closelog()
        free(_sl_ident);
        _sl_ident = NULL;
 
+       _sl_fac = 0;
+
        pthread_mutex_unlock(&_sl_lock);
 }