FreeRDP
Loading...
Searching...
No Matches
Appender.c
1
20#include <winpr/config.h>
21
22#include "Appender.h"
23
24void WLog_Appender_Free(wLog* log, wLogAppender* appender)
25{
26 if (!appender)
27 return;
28
29 if (appender->Layout)
30 {
31 WLog_Layout_Free(log, appender->Layout);
32 appender->Layout = nullptr;
33 }
34
35 DeleteCriticalSection(&appender->lock);
36 appender->Free(appender);
37}
38
39wLogAppender* WLog_GetLogAppender(wLog* log)
40{
41 if (!log)
42 return nullptr;
43
44 if (!log->Appender)
45 return WLog_GetLogAppender(log->Parent);
46
47 return log->Appender;
48}
49
50BOOL WLog_OpenAppender(wLog* log)
51{
52 int status = 0;
53 wLogAppender* appender = nullptr;
54
55 appender = WLog_GetLogAppender(log);
56
57 if (!appender)
58 return FALSE;
59
60 if (!appender->Open)
61 return TRUE;
62
63 if (!appender->active)
64 {
65 status = appender->Open(log, appender);
66 appender->active = TRUE;
67 }
68
69 return status;
70}
71
72BOOL WLog_CloseAppender(wLog* log)
73{
74 int status = 0;
75 wLogAppender* appender = nullptr;
76
77 appender = WLog_GetLogAppender(log);
78
79 if (!appender)
80 return FALSE;
81
82 if (!appender->Close)
83 return TRUE;
84
85 if (appender->active)
86 {
87 status = appender->Close(log, appender);
88 appender->active = FALSE;
89 }
90
91 return status;
92}
93
94static wLogAppender* WLog_Appender_New(wLog* log, DWORD logAppenderType)
95{
96 wLogAppender* appender = nullptr;
97
98 if (!log)
99 return nullptr;
100
101 switch (logAppenderType)
102 {
103 case WLOG_APPENDER_CONSOLE:
104 appender = WLog_ConsoleAppender_New(log);
105 break;
106 case WLOG_APPENDER_FILE:
107 appender = WLog_FileAppender_New(log);
108 break;
109 case WLOG_APPENDER_BINARY:
110 appender = WLog_BinaryAppender_New(log);
111 break;
112 case WLOG_APPENDER_CALLBACK:
113 appender = WLog_CallbackAppender_New(log);
114 break;
115#ifdef WINPR_HAVE_SYSLOG_H
116 case WLOG_APPENDER_SYSLOG:
117 appender = WLog_SyslogAppender_New(log);
118 break;
119#endif
120#ifdef WINPR_HAVE_JOURNALD_H
121 case WLOG_APPENDER_JOURNALD:
122 appender = WLog_JournaldAppender_New(log);
123 break;
124#endif
125 case WLOG_APPENDER_UDP:
126 appender = WLog_UdpAppender_New(log);
127 break;
128 default:
129 (void)fprintf(stderr, "%s: unknown handler type %" PRIu32 "\n", __func__,
130 logAppenderType);
131 appender = nullptr;
132 break;
133 }
134
135 if (!appender)
136 appender = WLog_ConsoleAppender_New(log);
137
138 if (!appender)
139 return nullptr;
140
141 if (!(appender->Layout = WLog_Layout_New(log)))
142 {
143 WLog_Appender_Free(log, appender);
144 return nullptr;
145 }
146
147 if (!InitializeCriticalSectionAndSpinCount(&appender->lock, 4000))
148 {
149 WLog_Appender_Free(log, appender);
150 return nullptr;
151 }
152
153 return appender;
154}
155
156BOOL WLog_SetLogAppenderType(wLog* log, DWORD logAppenderType)
157{
158 if (!log)
159 return FALSE;
160
161 if (log->Appender)
162 {
163 WLog_Appender_Free(log, log->Appender);
164 log->Appender = nullptr;
165 }
166
167 log->Appender = WLog_Appender_New(log, logAppenderType);
168 return log->Appender != nullptr;
169}
170
171BOOL WLog_ConfigureAppender(wLogAppender* appender, const char* setting, void* value)
172{
173 /* Just check the settings string is not empty */
174 if (!appender || !setting || (strnlen(setting, 2) == 0))
175 return FALSE;
176
177 if (appender->Set)
178 return appender->Set(appender, setting, value);
179 else
180 return FALSE;
181}