summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRusty Wagner <dontpanic@binaryninja.com>2015-03-03 16:43:50 -0500
committerRusty Wagner <dontpanic@binaryninja.com>2015-03-03 16:43:50 -0500
commit512ebc2ac144111702171d7ac8c6a1eb2d25b650 (patch)
tree67ccfb90b837d87e7a9a640204eccc55881d7232
parentea4cfdfef205194674fa9cb1beda4eaa56fd1fb8 (diff)
Add a logging system
-rw-r--r--api.pro3
-rw-r--r--binaryninjaapi.h27
-rw-r--r--log.cpp135
3 files changed, 164 insertions, 1 deletions
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 <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();
+}