1//
2//  MsgTrace.c
3//  AppleCDC
4//
5//  Created by test on 8/19/12.
6//
7//
8
9#include <sys/systm.h>
10#include <sys/malloc.h>
11#include <sys/syslog.h>
12#include <sys/kernel.h>
13#include <sys/fslog.h>
14#include <IOKit/IOLib.h>
15
16
17/* Message Tracing Defines */
18#define CDC_ASL_MAX_FMT_LEN         1024
19#define CDC_ASL_MSG_LEN             "         0"
20#define CDC_ASL_LEVEL_NOTICE		5
21#define CDC_ASL_KEY_DOMAIN          "com.apple.message.domain"
22#define CDC_ASL_KEY_SIG             "com.apple.message.signature"
23#define CDC_ASL_KEY_SIG2			"com.apple.message.signature2"
24#define CDC_ASL_KEY_SIG3			"com.apple.message.signature3"
25#define CDC_ASL_KEY_SUCCESS         "com.apple.message.success"
26#define CDC_ASL_SUCCESS_VALUE		1
27#define CDC_ASL_KEY_VALUE			"com.apple.message.value"
28#define CDC_ASL_KEY_MSG             "Message"
29
30#define CDC_ASL_DOMAIN              "com.apple.commssw.cdc.device"
31#define CDC_LOG_KEY_LEVEL           "Level"
32
33/*
34 * Log a message for MessageTracer.
35 */
36__private_extern__ void cdc_LogToMessageTracer(const char *domain, const char *signature, const char *signature2, const char *signature3, u_int64_t optValue, int optSucceeded)
37{
38	char *fmt = NULL;		/* Format string to use with vaddlog */
39	char *temp = NULL;
40
41	if ( (domain == NULL) || (signature == NULL) ) {
42		/* domain and signature are required */
43		return;
44	}
45
46    fmt = (char *)IOMalloc(CDC_ASL_MAX_FMT_LEN);
47	if (fmt == NULL)
48		return;
49
50    temp = (char *)IOMalloc(CDC_ASL_MAX_FMT_LEN);
51	if (temp == NULL) {
52        IOFree(fmt, CDC_ASL_MAX_FMT_LEN);
53		return;
54	}
55
56    if ((signature3 != NULL) && (signature2 != NULL))
57    {
58        snprintf(fmt, CDC_ASL_MAX_FMT_LEN, "%s [%s %d] [%s %s] [%s %s] [%s %s] [%s %s]",
59                 CDC_ASL_MSG_LEN,
60                 CDC_LOG_KEY_LEVEL, CDC_ASL_LEVEL_NOTICE,
61                 CDC_ASL_KEY_DOMAIN, domain,
62                 CDC_ASL_KEY_SIG, signature,
63                 CDC_ASL_KEY_SIG2, signature2,
64                 CDC_ASL_KEY_SIG3, signature3);
65    }
66    else
67        if ((signature3 == NULL) && (signature2 != NULL))
68        {
69            snprintf(fmt, CDC_ASL_MAX_FMT_LEN, "%s [%s %d] [%s %s] [%s %s] [%s %s]",
70                     CDC_ASL_MSG_LEN,
71                     CDC_LOG_KEY_LEVEL, CDC_ASL_LEVEL_NOTICE,
72                     CDC_ASL_KEY_DOMAIN, domain,
73                     CDC_ASL_KEY_SIG, signature,
74                     CDC_ASL_KEY_SIG2, signature2);
75        }
76        else
77            snprintf(fmt, CDC_ASL_MAX_FMT_LEN, "%s [%s %d] [%s %s] [%s %s]",
78                     CDC_ASL_MSG_LEN,
79                     CDC_LOG_KEY_LEVEL, CDC_ASL_LEVEL_NOTICE,
80                     CDC_ASL_KEY_DOMAIN, domain,
81                     CDC_ASL_KEY_SIG, signature);
82
83	if (optSucceeded == 1) {
84		/* Optional mark successes as such.  (Don't mark failures.) */
85		snprintf(temp, CDC_ASL_MAX_FMT_LEN, " [%s %d]", CDC_ASL_KEY_SUCCESS, CDC_ASL_SUCCESS_VALUE);
86		strlcat(fmt, temp, CDC_ASL_MAX_FMT_LEN);
87	}
88
89	if (optValue != 0) {
90		/* Optional value */
91		snprintf(temp, CDC_ASL_MAX_FMT_LEN, " [%s %lld]", CDC_ASL_KEY_VALUE, optValue);
92		strlcat(fmt, temp, CDC_ASL_MAX_FMT_LEN);
93	}
94
95	/* Print the key-value pairs in ASL format */
96	IOLog("%s\n", fmt);
97
98	if (fmt != NULL)
99        IOFree(fmt, CDC_ASL_MAX_FMT_LEN);
100	if (temp != NULL)
101        IOFree(temp, CDC_ASL_MAX_FMT_LEN);
102}
103
104