diff options
| author | Rusty Wagner <dontpanic@binaryninja.com> | 2015-03-03 16:43:50 -0500 |
|---|---|---|
| committer | Rusty Wagner <dontpanic@binaryninja.com> | 2015-03-03 16:43:50 -0500 |
| commit | 512ebc2ac144111702171d7ac8c6a1eb2d25b650 (patch) | |
| tree | 67ccfb90b837d87e7a9a640204eccc55881d7232 | |
| parent | ea4cfdfef205194674fa9cb1beda4eaa56fd1fb8 (diff) | |
Add a logging system
| -rw-r--r-- | api.pro | 3 | ||||
| -rw-r--r-- | binaryninjaapi.h | 27 | ||||
| -rw-r--r-- | log.cpp | 135 |
3 files changed, 164 insertions, 1 deletions
@@ -24,7 +24,8 @@ SOURCES += \ basicblock.cpp \ function.cpp \ functiongraph.cpp \ - functiongraphblock.cpp + functiongraphblock.cpp \ + log.cpp HEADERS += binaryninjaapi.h unix { diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 2c031b89..2b0d53ad 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -124,6 +124,33 @@ namespace BinaryNinja } }; + class LogListener + { + static void LogMessageCallback(void* ctxt, BNLogLevel level, const char* msg); + static void CloseLogCallback(void* ctxt); + + public: + virtual ~LogListener() {} + + static void RegisterLogListener(LogListener* listener); + static void UnregisterLogListener(LogListener* listener); + + virtual void LogMessage(BNLogLevel level, const std::string& msg) = 0; + virtual void CloseLog() {} + }; + + void Log(BNLogLevel level, const char* fmt, ...); + void LogDebug(const char* fmt, ...); + void LogInfo(const char* fmt, ...); + void LogWarn(const char* fmt, ...); + void LogError(const char* fmt, ...); + void LogAlert(const char* fmt, ...); + + void LogToStdout(BNLogLevel minimumLevel); + void LogToStderr(BNLogLevel minimumLevel); + bool LogToFile(BNLogLevel minimumLevel, const std::string& path, bool append = false); + void CloseLogs(); + class DataBuffer { BNDataBuffer* m_buffer; diff --git a/log.cpp b/log.cpp new file mode 100644 index 00000000..941414e5 --- /dev/null +++ b/log.cpp @@ -0,0 +1,135 @@ +#define _CRT_SECURE_NO_WARNINGS +#include <stdarg.h> +#include <stdio.h> +#include "binaryninjaapi.h" + +using namespace BinaryNinja; +using namespace std; + + +void LogListener::LogMessageCallback(void* ctxt, BNLogLevel level, const char* msg) +{ + LogListener* listener = (LogListener*)ctxt; + listener->LogMessage(level, msg); +} + + +void LogListener::CloseLogCallback(void* ctxt) +{ + LogListener* listener = (LogListener*)ctxt; + listener->CloseLog(); +} + + +void LogListener::RegisterLogListener(LogListener* listener) +{ + BNLogListener callbacks; + callbacks.context = listener; + callbacks.log = LogMessageCallback; + callbacks.close = CloseLogCallback; + BNRegisterLogListener(&callbacks); +} + + +void LogListener::UnregisterLogListener(LogListener* listener) +{ + BNLogListener callbacks; + callbacks.context = listener; + callbacks.log = LogMessageCallback; + callbacks.close = CloseLogCallback; + BNUnregisterLogListener(&callbacks); +} + + +static void PerformLog(BNLogLevel level, const char* fmt, va_list args) +{ +#if defined(_MSC_VER) + int len = _vscprintf(fmt, args); + if (len < 0) + return; + char* msg = malloc(len + 1); + if (!msg) + return; + if (vsnprintf(msg, len + 1, fmt, args) >= 0) + BNLog(level, "%s", msg); + free(msg); +#else + char* msg; + if (vasprintf(&msg, fmt, args) < 0) + return; + BNLog(level, "%s", msg); + free(msg); +#endif +} + + +void BinaryNinja::Log(BNLogLevel level, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + PerformLog(level, fmt, args); +} + + +void BinaryNinja::LogDebug(const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + PerformLog(DebugLog, fmt, args); +} + + +void BinaryNinja::LogInfo(const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + PerformLog(InfoLog, fmt, args); +} + + +void BinaryNinja::LogWarn(const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + PerformLog(WarningLog, fmt, args); +} + + +void BinaryNinja::LogError(const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + PerformLog(ErrorLog, fmt, args); +} + + +void BinaryNinja::LogAlert(const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + PerformLog(AlertLog, fmt, args); +} + + +void BinaryNinja::LogToStdout(BNLogLevel minimumLevel) +{ + BNLogToStdout(minimumLevel); +} + + +void BinaryNinja::LogToStderr(BNLogLevel minimumLevel) +{ + BNLogToStderr(minimumLevel); +} + + +bool BinaryNinja::LogToFile(BNLogLevel minimumLevel, const string& path, bool append) +{ + return BNLogToFile(minimumLevel, path.c_str(), append); +} + + +void BinaryNinja::CloseLogs() +{ + BNCloseLogs(); +} |
