22#include <winpr/config.h>
24#include "BinaryAppender.h"
26#include <winpr/assert.h>
27#include <winpr/file.h>
28#include <winpr/path.h>
29#include <winpr/stream.h>
33 WLOG_APPENDER_COMMON();
41static BOOL WLog_BinaryAppender_Open(wLog* log, wLogAppender* appender)
43 wLogBinaryAppender* binaryAppender = NULL;
44 if (!log || !appender)
47 binaryAppender = (wLogBinaryAppender*)appender;
48 if (!binaryAppender->FileName)
50 binaryAppender->FileName = (
char*)malloc(MAX_PATH);
51 if (!binaryAppender->FileName)
53 (void)sprintf_s(binaryAppender->FileName, MAX_PATH,
"%" PRIu32
".wlog",
54 GetCurrentProcessId());
57 if (!binaryAppender->FilePath)
59 binaryAppender->FilePath = GetKnownSubPath(KNOWN_PATH_TEMP,
"wlog");
60 if (!binaryAppender->FilePath)
64 if (!binaryAppender->FullFileName)
66 binaryAppender->FullFileName =
67 GetCombinedPath(binaryAppender->FilePath, binaryAppender->FileName);
68 if (!binaryAppender->FullFileName)
72 if (!winpr_PathFileExists(binaryAppender->FilePath))
74 if (!winpr_PathMakePath(binaryAppender->FilePath, 0))
76 UnixChangeFileMode(binaryAppender->FilePath, 0xFFFF);
79 binaryAppender->FileDescriptor = winpr_fopen(binaryAppender->FullFileName,
"a+");
81 if (!binaryAppender->FileDescriptor)
87static BOOL WLog_BinaryAppender_Close(WINPR_ATTR_UNUSED wLog* log, wLogAppender* appender)
89 wLogBinaryAppender* binaryAppender = NULL;
94 binaryAppender = (wLogBinaryAppender*)appender;
95 if (!binaryAppender->FileDescriptor)
98 if (binaryAppender->FileDescriptor)
99 (void)fclose(binaryAppender->FileDescriptor);
101 binaryAppender->FileDescriptor = NULL;
106static BOOL WLog_BinaryAppender_WriteMessage(wLog* log, wLogAppender* appender,
111 size_t MessageLength = 0;
112 size_t FileNameLength = 0;
113 size_t FunctionNameLength = 0;
114 size_t TextStringLength = 0;
116 wLogBinaryAppender* binaryAppender = NULL;
118 if (!log || !appender || !message)
121 binaryAppender = (wLogBinaryAppender*)appender;
123 fp = binaryAppender->FileDescriptor;
128 FileNameLength = strnlen(message->FileName, INT_MAX);
129 FunctionNameLength = strnlen(message->FunctionName, INT_MAX);
130 TextStringLength = strnlen(message->TextString, INT_MAX);
133 16 + (4 + FileNameLength + 1) + (4 + FunctionNameLength + 1) + (4 + TextStringLength + 1);
135 if ((MessageLength > UINT32_MAX) || (FileNameLength > UINT32_MAX) ||
136 (FunctionNameLength > UINT32_MAX) || (TextStringLength > UINT32_MAX))
139 s = Stream_New(NULL, MessageLength);
143 Stream_Write_UINT32(s, (UINT32)MessageLength);
145 Stream_Write_UINT32(s, message->Type);
146 Stream_Write_UINT32(s, message->Level);
148 WINPR_ASSERT(message->LineNumber <= UINT32_MAX);
149 Stream_Write_UINT32(s, (UINT32)message->LineNumber);
151 Stream_Write_UINT32(s, (UINT32)FileNameLength);
152 Stream_Write(s, message->FileName, FileNameLength + 1);
154 Stream_Write_UINT32(s, (UINT32)FunctionNameLength);
155 Stream_Write(s, message->FunctionName, FunctionNameLength + 1);
157 Stream_Write_UINT32(s, (UINT32)TextStringLength);
158 Stream_Write(s, message->TextString, TextStringLength + 1);
160 Stream_SealLength(s);
162 if (fwrite(Stream_Buffer(s), MessageLength, 1, fp) != 1)
165 Stream_Free(s, TRUE);
170static BOOL WLog_BinaryAppender_WriteDataMessage(WINPR_ATTR_UNUSED wLog* log,
171 WINPR_ATTR_UNUSED wLogAppender* appender,
177static BOOL WLog_BinaryAppender_WriteImageMessage(WINPR_ATTR_UNUSED wLog* log,
178 WINPR_ATTR_UNUSED wLogAppender* appender,
184static BOOL WLog_BinaryAppender_Set(wLogAppender* appender,
const char* setting,
void* value)
186 wLogBinaryAppender* binaryAppender = (wLogBinaryAppender*)appender;
189 if (!value || (strnlen(value, 2) == 0))
192 if (!strcmp(
"outputfilename", setting))
194 binaryAppender->FileName = _strdup((
const char*)value);
195 if (!binaryAppender->FileName)
198 else if (!strcmp(
"outputfilepath", setting))
200 binaryAppender->FilePath = _strdup((
const char*)value);
201 if (!binaryAppender->FilePath)
210static void WLog_BinaryAppender_Free(wLogAppender* appender)
212 wLogBinaryAppender* binaryAppender = NULL;
215 binaryAppender = (wLogBinaryAppender*)appender;
216 free(binaryAppender->FileName);
217 free(binaryAppender->FilePath);
218 free(binaryAppender->FullFileName);
219 free(binaryAppender);
223wLogAppender* WLog_BinaryAppender_New(WINPR_ATTR_UNUSED wLog* log)
225 wLogBinaryAppender* BinaryAppender = NULL;
227 BinaryAppender = (wLogBinaryAppender*)calloc(1,
sizeof(wLogBinaryAppender));
231 BinaryAppender->Type = WLOG_APPENDER_BINARY;
232 BinaryAppender->Open = WLog_BinaryAppender_Open;
233 BinaryAppender->Close = WLog_BinaryAppender_Close;
234 BinaryAppender->WriteMessage = WLog_BinaryAppender_WriteMessage;
235 BinaryAppender->WriteDataMessage = WLog_BinaryAppender_WriteDataMessage;
236 BinaryAppender->WriteImageMessage = WLog_BinaryAppender_WriteImageMessage;
237 BinaryAppender->Free = WLog_BinaryAppender_Free;
238 BinaryAppender->Set = WLog_BinaryAppender_Set;
240 return (wLogAppender*)BinaryAppender;