1/* Copyright (c) 2012-2013 Apple Inc. All rights reserved.
2 *
3 * @APPLE_LICENSE_HEADER_START@
4 *
5 * This file contains Original Code and/or Modifications of Original Code
6 * as defined in and that are subject to the Apple Public Source License
7 * Version 2.0 (the 'License'). You may not use this file except in
8 * compliance with the License. Please obtain a copy of the License at
9 * http://www.opensource.apple.com/apsl/ and read it before using this
10 * file.
11 *
12 * The Original Code and all software distributed under the License are
13 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
17 * Please see the License for the specific language governing rights and
18 * limitations under the License.
19 *
20 * @APPLE_LICENSE_HEADER_END@
21 */
22
23#ifndef __OS_DEBUG_LOG_H__
24#define __OS_DEBUG_LOG_H__
25
26#include <Availability.h>
27#include <TargetConditionals.h>
28
29#include <os/base_private.h>
30#include <stdarg.h>
31
32__OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_6_0)
33OS_FORMAT_PRINTF(1, 2)
34extern void
35_os_debug_log(const char *msg, ...);
36
37/* The os_debug_log macros insert spaces before the message. If logging to a file,
38 * the spaces will be replaced by a timestamp. If logging to syslog, they will
39 * be skipped (syslog knows what time it is). There are 20 spaces because the
40 * timestamp is printed as %16llu + 4 spaces before the next column.
41 * 10^16 ns = 3.8 months. Don't run your process in _debug for that long. This
42 * isn't syslog.
43 */
44#define _OS_DEBUG_LOG_PREFIX "                    "
45
46#define os_debug_log(tag, fmt, ...) __extension__({\
47	_os_debug_log(_OS_DEBUG_LOG_PREFIX "%s: " fmt, tag, ## __VA_ARGS__); \
48})
49
50#define os_debug_log_ctx(tag, ctx, fmt, ...) __extension__({\
51	_os_debug_log(_OS_DEBUG_LOG_PREFIX "[%p]  %s: " fmt, ctx, tag, ## __VA_ARGS__); \
52})
53
54/* This is useful for clients who wish for the messages generated by os_debug_log()
55 * or os_assumes() failures to go somewhere other than (or in addition to) the
56 * system log, for example launchd or syslogd itself. If you don't wish for the
57 * message to be logged to the system log, then return true (to indicate that
58 * the message has been handled). If you want the default behavior, return
59 * false. Please use this macro, rather than directly declaring a function,
60 * since the declaration magic may change in the future.
61 */
62#define os_debug_log_redirect(func) \
63	__attribute__((__used__)) \
64	__attribute__((__visibility__("default"))) \
65	bool _os_debug_log_redirect_func(const char *msg) { \
66		return func(msg); \
67	}
68
69# pragma mark -
70# pragma mark Private To Libc
71
72// str must be modifiable (non-const)!
73__OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_6_0)
74extern void
75_os_debug_log_error_str(char *str);
76
77#endif /* __OS_DEBUG_LOG_H__ */
78