#include <winpr/print.h>
#include <winpr/debug.h>
#include <winpr/environment.h>
+#include <winpr/wlog.h>
#if defined(ANDROID)
#include <android/log.h>
#include "wlog.h"
-
struct _wLogFilter
{
DWORD Level;
"OFF"
};
+static INIT_ONCE _WLogInitialized = INIT_ONCE_STATIC_INIT;
static DWORD g_FilterCount = 0;
static wLogFilter* g_Filters = NULL;
+static wLog* g_RootLog = NULL;
+static wLog* WLog_New(LPCSTR name, wLog* rootLogger);
+static void WLog_Free(wLog* log);
static LONG WLog_GetFilterLogLevel(wLog* log);
static int WLog_ParseLogLevel(LPCSTR level);
static BOOL WLog_ParseFilter(wLogFilter* filter, LPCSTR name);
+static BOOL WLog_ParseFilters(void);
+
+static void WLog_Uninit_(void)
+{
+ DWORD index;
+ wLog* child = NULL;
+ wLog* root = g_RootLog;
+
+ if (!root)
+ return;
+
+ for (index = 0; index < root->ChildrenCount; index++)
+ {
+ child = root->Children[index];
+ WLog_Free(child);
+ }
+
+ WLog_Free(root);
+ g_RootLog = NULL;
+}
+
+static BOOL CALLBACK WLog_InitializeRoot(PINIT_ONCE InitOnce, PVOID Parameter, PVOID* Context)
+{
+ char* env;
+ DWORD nSize;
+ DWORD logAppenderType;
+ LPCSTR appender = "WLOG_APPENDER";
+
+ if (!(g_RootLog = WLog_New("", NULL)))
+ return FALSE;
+
+ g_RootLog->IsRoot = TRUE;
+ WLog_ParseFilters();
+ logAppenderType = WLOG_APPENDER_CONSOLE;
+ nSize = GetEnvironmentVariableA(appender, NULL, 0);
+
+ if (nSize)
+ {
+ env = (LPSTR) malloc(nSize);
+
+ if (!env)
+ goto fail;
+
+ if (GetEnvironmentVariableA(appender, env, nSize) != nSize - 1)
+ {
+ fprintf(stderr, "%s environment variable modified in my back", appender);
+ free(env);
+ goto fail;
+ }
+
+ if (_stricmp(env, "CONSOLE") == 0)
+ logAppenderType = WLOG_APPENDER_CONSOLE;
+ else if (_stricmp(env, "FILE") == 0)
+ logAppenderType = WLOG_APPENDER_FILE;
+ else if (_stricmp(env, "BINARY") == 0)
+ logAppenderType = WLOG_APPENDER_BINARY;
+
+#ifdef HAVE_SYSLOG_H
+ else if (_stricmp(env, "SYSLOG") == 0)
+ logAppenderType = WLOG_APPENDER_SYSLOG;
+
+#endif /* HAVE_SYSLOG_H */
+#ifdef HAVE_JOURNALD_H
+ else if (_stricmp(env, "JOURNALD") == 0)
+ logAppenderType = WLOG_APPENDER_JOURNALD;
+
+#endif
+ else if (_stricmp(env, "UDP") == 0)
+ logAppenderType = WLOG_APPENDER_UDP;
+
+ free(env);
+ }
+
+ if (!WLog_SetLogAppenderType(g_RootLog, logAppenderType))
+ goto fail;
+
+ atexit(WLog_Uninit_);
+ return TRUE;
+fail:
+ free(g_RootLog);
+ g_RootLog = NULL;
+ return FALSE;
+}
static BOOL log_recursion(LPCSTR file, LPCSTR fkt, int line)
{
return TRUE;
}
-BOOL WLog_Write(wLog* log, wLogMessage* message)
+static BOOL WLog_Write(wLog* log, wLogMessage* message)
{
BOOL status;
wLogAppender* appender;
return status;
}
-BOOL WLog_WriteData(wLog* log, wLogMessage* message)
+static BOOL WLog_WriteData(wLog* log, wLogMessage* message)
{
BOOL status;
wLogAppender* appender;
return status;
}
-BOOL WLog_WriteImage(wLog* log, wLogMessage* message)
+static BOOL WLog_WriteImage(wLog* log, wLogMessage* message)
{
BOOL status;
wLogAppender* appender;
return status;
}
-BOOL WLog_WritePacket(wLog* log, wLogMessage* message)
+static BOOL WLog_WritePacket(wLog* log, wLogMessage* message)
{
BOOL status;
wLogAppender* appender;
if (GetEnvironmentVariableA(filter, env, nSize) == nSize - 1)
res = WLog_AddStringLogFilters(env);
+
free(env);
return res;
}
return log->FilterLevel;
}
-BOOL WLog_ParseName(wLog* log, LPCSTR name)
+static BOOL WLog_ParseName(wLog* log, LPCSTR name)
{
char* p;
int count;
else
{
LPCSTR level = "WLOG_LEVEL";
-
log->Level = WLOG_INFO;
nSize = GetEnvironmentVariableA(level, NULL, 0);
}
}
-static wLog* g_RootLog = NULL;
-
wLog* WLog_GetRoot(void)
{
- char* env;
- DWORD nSize;
- DWORD logAppenderType;
-
- if (!g_RootLog)
- {
- LPCSTR appender = "WLOG_APPENDER";
-
- if (!(g_RootLog = WLog_New("", NULL)))
- return NULL;
-
- g_RootLog->IsRoot = TRUE;
- WLog_ParseFilters();
- logAppenderType = WLOG_APPENDER_CONSOLE;
- nSize = GetEnvironmentVariableA(appender, NULL, 0);
-
- if (nSize)
- {
- env = (LPSTR) malloc(nSize);
-
- if (!env)
- goto fail;
-
- if (GetEnvironmentVariableA(appender, env, nSize) != nSize - 1)
- {
- fprintf(stderr, "%s environment variable modified in my back", appender);
- free(env);
- goto fail;
- }
-
- if (_stricmp(env, "CONSOLE") == 0)
- logAppenderType = WLOG_APPENDER_CONSOLE;
- else if (_stricmp(env, "FILE") == 0)
- logAppenderType = WLOG_APPENDER_FILE;
- else if (_stricmp(env, "BINARY") == 0)
- logAppenderType = WLOG_APPENDER_BINARY;
-
-#ifdef HAVE_SYSLOG_H
- else if (_stricmp(env, "SYSLOG") == 0)
- logAppenderType = WLOG_APPENDER_SYSLOG;
-
-#endif /* HAVE_SYSLOG_H */
-#ifdef HAVE_JOURNALD_H
- else if (_stricmp(env, "JOURNALD") == 0)
- logAppenderType = WLOG_APPENDER_JOURNALD;
-
-#endif
- else if (_stricmp(env, "UDP") == 0)
- logAppenderType = WLOG_APPENDER_UDP;
-
- free(env);
- }
-
- if (!WLog_SetLogAppenderType(g_RootLog, logAppenderType))
- goto fail;
- }
+ if (!InitOnceExecuteOnce(&_WLogInitialized, WLog_InitializeRoot, NULL, NULL))
+ return NULL;
return g_RootLog;
-fail:
- free(g_RootLog);
- g_RootLog = NULL;
- return NULL;
}
-BOOL WLog_AddChild(wLog* parent, wLog* child)
+static BOOL WLog_AddChild(wLog* parent, wLog* child)
{
if (parent->ChildrenCount >= parent->ChildrenSize)
{
return TRUE;
}
-wLog* WLog_FindChild(LPCSTR name)
+static wLog* WLog_FindChild(LPCSTR name)
{
DWORD index;
wLog* root;
BOOL WLog_Uninit(void)
{
- DWORD index;
- wLog* child = NULL;
- wLog* root = g_RootLog;
-
- if (!root)
- return FALSE;
-
- for (index = 0; index < root->ChildrenCount; index++)
- {
- child = root->Children[index];
- WLog_Free(child);
- }
-
- WLog_Free(root);
- g_RootLog = NULL;
-
return TRUE;
}
+