]>
git.saurik.com Git - apple/xnu.git/blob - bsd/kern/kern_asl.c
2 * Copyright (c) 2020 Apple Inc. All rights reserved.
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
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. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
29 #include <sys/errno.h>
30 #include <sys/types.h>
31 #include <sys/malloc.h>
34 #include <sys/kauth.h>
35 #include <sys/mount.h>
36 #include <sys/vnode.h>
37 #include <sys/syslog.h>
38 #include <sys/vnode_internal.h>
39 #include <sys/fslog.h>
40 #include <sys/mount_internal.h>
43 #include <dev/random/randomdev.h>
45 #include <uuid/uuid.h>
49 /* String to append as format modifier for each key-value pair */
50 #define KASL_KEYVAL_FMT "[%s %s] "
51 #define KASL_KEYVAL_FMT_LEN (sizeof(KASL_KEYVAL_FMT) - 1)
53 #define KASL_NEWLINE_CHAR "\n"
54 #define KASL_NEWLINE_CHAR_LEN (sizeof(KASL_NEWLINE_CHAR) - 1)
56 /* Length of entire ASL message in 10 characters. Kernel defaults to zero */
57 #define KASL_ASL_MSG_LEN " 0"
59 /* Length of default format string to be used by printf */
60 #define MAX_FMT_LEN 256
63 /* Function to print input values as key-value pairs in format
64 * identifiable by Apple system log (ASL) facility. All key-value pairs
65 * are assumed to be pointer to strings and are provided using va_list
66 * argument which is a list of varying number of arguments created by the
67 * caller of this function.
70 * level - Priority level for this ASL message
71 * facility - Facility for this ASL message.
72 * num_pairs - Number of key-value pairs provided by vargs argument.
73 * vargs - List of key-value pairs.
76 * zero - On success, when it prints all key-values pairs provided.
77 * E2BIG - When it cannot print all key-value pairs provided and had
78 * to truncate the output.
81 kern_asl_msg_va(int level
, const char *facility
, size_t num_pairs
, va_list vargs
)
84 char fmt
[MAX_FMT_LEN
]; /* Format string to use with vaddlog */
85 size_t calc_pairs
= 0;
88 /* Mask extra bits, if any, from priority level */
89 level
= LOG_PRI(level
);
91 /* Create the first part of format string consisting of ASL
92 * message length, level, and facility.
95 snprintf(fmt
, MAX_FMT_LEN
, "%s [%s %d] [%s %s] ",
97 KASL_KEY_LEVEL
, level
,
98 KASL_KEY_FACILITY
, facility
);
100 snprintf(fmt
, MAX_FMT_LEN
, "%s [%s %d] ",
102 KASL_KEY_LEVEL
, level
);
105 /* Determine the number of key-value format string [%s %s] that
106 * should be added in format string for every key-value pair provided
107 * in va_list. Calculate maximum number of format string that can be
108 * accommodated in the remaining format buffer (after saving space
109 * for newline character). If the caller provided pairs in va_list
110 * is more than calculated pairs, truncate extra pairs.
112 len
= MAX_FMT_LEN
- strlen(fmt
) - KASL_NEWLINE_CHAR_LEN
- 1;
113 calc_pairs
= len
/ KASL_KEYVAL_FMT_LEN
;
114 if (num_pairs
<= calc_pairs
) {
115 calc_pairs
= num_pairs
;
120 /* Append format strings [%s %s] for the key-value pairs in vargs */
121 len
= MAX_FMT_LEN
- KASL_NEWLINE_CHAR_LEN
;
122 for (size_t i
= 0; i
< calc_pairs
; i
++) {
123 (void) strlcat(fmt
, KASL_KEYVAL_FMT
, len
);
127 (void) strlcat(fmt
, KASL_NEWLINE_CHAR
, MAX_FMT_LEN
);
129 /* Print the key-value pairs in ASL format */
133 * Note: can't use os_log_with_args() here because 'fmt' is
134 * constructed on the stack i.e. doesn't come from a text
135 * section. More importantly, the newer logging system
136 * doesn't grok ASL either.
143 kern_asl_msg(int level
, const char *facility
, size_t num_pairs
, ...)
148 va_start(ap
, num_pairs
);
149 err
= kern_asl_msg_va(level
, facility
,
156 /* Search if given string contains '[' and ']'. If any, escape it by
157 * prefixing with a '\'. If the length of the string is not big enough,
158 * no changes are done and error is returned.
161 * str - string that can contain '[' or ']', should be NULL terminated
162 * len - length, in bytes, of valid data, including NULL character.
163 * buflen - size of buffer that contains the string
166 escape_str(char *str
, size_t len
, size_t buflen
)
171 /* Count number of characters to escape */
175 if ((*src
== '[') || (*src
== ']')) {
182 * Check if the buffer has enough space to escape all
185 if ((buflen
- len
) < count
) {
193 if ((*src
== '[') || (*src
== ']')) {
194 /* Last char copied needs to be escaped */