X-Git-Url: https://git.saurik.com/apple/security.git/blobdiff_plain/80e2389990082500d76eb566d4946be3e786c3ef..d8f41ccd20de16f8ebe2ccc84d47bf1cb2b26bbb:/Security/utilities/src/debugging.h diff --git a/Security/utilities/src/debugging.h b/Security/utilities/src/debugging.h new file mode 100644 index 00000000..6505702e --- /dev/null +++ b/Security/utilities/src/debugging.h @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2006-2007,2009-2010,2012-2014 Apple Inc. All Rights Reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/* + * debugging.h - non-trivial debug support + */ +#ifndef _SECURITY_UTILITIES_DEBUGGING_H_ +#define _SECURITY_UTILITIES_DEBUGGING_H_ + +#ifdef KERNEL + #include + #define secalert(format, ...) printf((format), ## __VA_ARGS__) + #define secemergency(format, ...) printf((format), ## __VA_ARGS__) + #define seccritical(format, ...) printf((format), ## __VA_ARGS__) + #define secerror(format, ...) printf((format), ## __VA_ARGS__) + #define secwarning(format, ...) printf((format), ## __VA_ARGS__) + #define secnotice(scope, format, ...) printf((format), ## __VA_ARGS__) + #define secnoticeq(scope, format, ...) printf((format), ## __VA_ARGS__) + #define secinfo(scope, format, ...) printf((format), ## __VA_ARGS__) + #if !defined(NDEBUG) + #define secdebug(scope, format, ...) printf((format), ## __VA_ARGS__) + #else // NDEBUG + #define secdebug(scope, format, ...) /* nothing */ + #endif // NDEBUG +#else // !KERNEL + +#include +#include +#include + +__BEGIN_DECLS + +extern void __security_trace_enter_api(const char *api, CFStringRef format, ...) CF_FORMAT_FUNCTION(2, 3); +extern void __security_trace_return_api(const char *api, CFStringRef format, ...) CF_FORMAT_FUNCTION(2, 3); + +extern void __security_debug(CFStringRef scope, + const char *function, const char *file, int line, + CFStringRef format, ...) CF_FORMAT_FUNCTION(5,6); + +extern void __security_log(int level, CFStringRef scope, + const char *function, const char *file, int line, + CFStringRef format, ...) CF_FORMAT_FUNCTION(6,7); + +#define sec_trace_enter_api(format...) __security_trace_enter_api(__FUNCTION__, format) +#define sec_trace_return_api(rtype, body, format...) { rtype _r = body(); __security_trace_return_api(__FUNCTION__, format, _r); return _r; } +#define sec_trace_return_bool_api(body, format...) { bool _r = body(); typeof(format) _fmt = format; __security_trace_return_api(__FUNCTION__, _fmt ? _fmt : CFSTR("return=%d"), (int)_r); return _r; } + +#define secemergency(format, ...) __security_log(ASL_LEVEL_EMERG, NULL, \ + __FUNCTION__, __FILE__, __LINE__, \ + CFSTR(format), ## __VA_ARGS__) + +#define secalert(format, ...) __security_log(ASL_LEVEL_ALERT, NULL, \ + __FUNCTION__, __FILE__, __LINE__, \ + CFSTR(format), ## __VA_ARGS__) + +#define seccritical(format, ...) __security_log(ASL_LEVEL_CRIT, NULL, \ + __FUNCTION__, __FILE__, __LINE__, \ + CFSTR(format), ## __VA_ARGS__) + +#define secerror(format, ...) __security_log(ASL_LEVEL_ERR, NULL, \ + __FUNCTION__, __FILE__, __LINE__, \ + CFSTR(format), ## __VA_ARGS__) + +#define secerrorq(format, ...) __security_log(ASL_LEVEL_ERR, NULL, \ + "", "", 0, \ + CFSTR(format), ## __VA_ARGS__) + +#define secwarning(format, ...) __security_log(ASL_LEVEL_WARNING, NULL, \ + __FUNCTION__, __FILE__, __LINE__, \ + CFSTR(format), ## __VA_ARGS__) + +#define secnotice(scope, format, ...) __security_log(ASL_LEVEL_NOTICE, CFSTR(scope), \ + __FUNCTION__, __FILE__, __LINE__, \ + CFSTR(format), ## __VA_ARGS__) + +#define secnoticeq(scope, format, ...) __security_log(ASL_LEVEL_NOTICE, CFSTR(scope), \ + "", "", 0, \ + CFSTR(format), ## __VA_ARGS__) + +#define secinfo(scope, format, ...) __security_log(ASL_LEVEL_INFO, CFSTR(scope), \ + __FUNCTION__, __FILE__, __LINE__, \ + CFSTR(format), ## __VA_ARGS__) + +#if !defined(NDEBUG) + +# define secdebug(scope,format, ...) __security_debug(CFSTR(scope), \ + __FUNCTION__, __FILE__, __LINE__, \ + CFSTR(format), ## __VA_ARGS__) +#else +# define secdebug(scope,...) /* nothing */ +#endif + +typedef void (^security_log_handler)(int level, CFStringRef scope, const char *function, + const char *file, int line, CFStringRef message); + +void add_security_log_handler(security_log_handler handler); +void remove_security_log_handler(security_log_handler handler); + +/* To simulate a process crash in some conditions */ +void __security_simulatecrash(CFStringRef reason, uint32_t code); + +/* predefined simulate crash exception codes */ +#define __sec_exception_code(x) (0x53c00000+x) +#define __sec_exception_code_CorruptDb(db,rc) __sec_exception_code(1|((db)<<8)|((rc)<<16)) +#define __sec_exception_code_CorruptItem __sec_exception_code(2) +#define __sec_exception_code_OTRError __sec_exception_code(3) +#define __sec_exception_code_DbItemDescribe __sec_exception_code(4) +#define __sec_exception_code_TwiceCorruptDb(db) __sec_exception_code(5|((db)<<8)) + +/* Logging control functions */ + +typedef enum { + kScopeIDEnvironment = 0, + kScopeIDDefaults = 1, + kScopeIDConfig = 2, + kScopeIDXPC = 3, + kScopeIDMax = 3, +} SecDebugScopeID; + +void ApplyScopeListForID(CFStringRef scopeList, SecDebugScopeID whichID); +void ApplyScopeDictionaryForID(CFDictionaryRef scopeList, SecDebugScopeID whichID); +CFPropertyListRef CopyCurrentScopePlist(void); + +__END_DECLS + +#endif // !KERNEL + +#endif /* _SECURITY_UTILITIES_DEBUGGING_H_ */