From 512ebc2ac144111702171d7ac8c6a1eb2d25b650 Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Tue, 3 Mar 2015 16:43:50 -0500 Subject: Add a logging system --- api.pro | 3 +- binaryninjaapi.h | 27 +++++++++++ log.cpp | 135 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 164 insertions(+), 1 deletion(-) create mode 100644 log.cpp diff --git a/api.pro b/api.pro index 0fe395f2..5026d9c3 100644 --- a/api.pro +++ b/api.pro @@ -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 +#include +#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(); +} -- cgit v1.3.1