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>
41static BOOL WLog_BinaryAppender_Open(wLog* log, wLogAppender* appender)
43 wLogBinaryAppender* binaryAppender =
nullptr;
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,
nullptr))
76 UnixChangeFileMode(binaryAppender->FilePath, 0xFFFF);
79 binaryAppender->FileDescriptor = winpr_fopen(binaryAppender->FullFileName,
"a+");
81 return binaryAppender->FileDescriptor !=
nullptr;
84static BOOL WLog_BinaryAppender_Close(WINPR_ATTR_UNUSED wLog* log, wLogAppender* appender)
86 wLogBinaryAppender* binaryAppender =
nullptr;
91 binaryAppender = (wLogBinaryAppender*)appender;
92 if (!binaryAppender->FileDescriptor)
95 if (binaryAppender->FileDescriptor)
96 (void)fclose(binaryAppender->FileDescriptor);
98 binaryAppender->FileDescriptor =
nullptr;
103static BOOL WLog_BinaryAppender_WriteMessage(wLog* log, wLogAppender* appender,
108 size_t MessageLength = 0;
109 size_t FileNameLength = 0;
110 size_t FunctionNameLength = 0;
111 size_t TextStringLength = 0;
113 wLogBinaryAppender* binaryAppender =
nullptr;
115 if (!log || !appender || !message)
118 binaryAppender = (wLogBinaryAppender*)appender;
120 fp = binaryAppender->FileDescriptor;
125 FileNameLength = strnlen(message->FileName, INT_MAX);
126 FunctionNameLength = strnlen(message->FunctionName, INT_MAX);
127 TextStringLength = strnlen(message->TextString, INT_MAX);
130 16 + (4 + FileNameLength + 1) + (4 + FunctionNameLength + 1) + (4 + TextStringLength + 1);
132 if ((MessageLength > UINT32_MAX) || (FileNameLength > UINT32_MAX) ||
133 (FunctionNameLength > UINT32_MAX) || (TextStringLength > UINT32_MAX))
136 s = Stream_New(
nullptr, MessageLength);
140 Stream_Write_UINT32(s, (UINT32)MessageLength);
142 Stream_Write_UINT32(s, message->Type);
143 Stream_Write_UINT32(s, message->Level);
145 WINPR_ASSERT(message->LineNumber <= UINT32_MAX);
146 Stream_Write_UINT32(s, (UINT32)message->LineNumber);
148 Stream_Write_UINT32(s, (UINT32)FileNameLength);
149 Stream_Write(s, message->FileName, FileNameLength + 1);
151 Stream_Write_UINT32(s, (UINT32)FunctionNameLength);
152 Stream_Write(s, message->FunctionName, FunctionNameLength + 1);
154 Stream_Write_UINT32(s, (UINT32)TextStringLength);
155 Stream_Write(s, message->TextString, TextStringLength + 1);
157 Stream_SealLength(s);
159 if (fwrite(Stream_Buffer(s), MessageLength, 1, fp) != 1)
162 Stream_Free(s, TRUE);
167static BOOL WLog_BinaryAppender_WriteDataMessage(WINPR_ATTR_UNUSED wLog* log,
168 WINPR_ATTR_UNUSED wLogAppender* appender,
174static BOOL WLog_BinaryAppender_WriteImageMessage(WINPR_ATTR_UNUSED wLog* log,
175 WINPR_ATTR_UNUSED wLogAppender* appender,
181static BOOL WLog_BinaryAppender_Set(wLogAppender* appender,
const char* setting,
void* value)
183 wLogBinaryAppender* binaryAppender = (wLogBinaryAppender*)appender;
186 if (!value || (strnlen(value, 2) == 0))
189 if (!strcmp(
"outputfilename", setting))
191 binaryAppender->FileName = _strdup((
const char*)value);
192 if (!binaryAppender->FileName)
195 else if (!strcmp(
"outputfilepath", setting))
197 binaryAppender->FilePath = _strdup((
const char*)value);
198 if (!binaryAppender->FilePath)
207static void WLog_BinaryAppender_Free(wLogAppender* appender)
209 wLogBinaryAppender* binaryAppender =
nullptr;
212 binaryAppender = (wLogBinaryAppender*)appender;
213 free(binaryAppender->FileName);
214 free(binaryAppender->FilePath);
215 free(binaryAppender->FullFileName);
216 free(binaryAppender);
220wLogAppender* WLog_BinaryAppender_New(WINPR_ATTR_UNUSED wLog* log)
222 wLogBinaryAppender* BinaryAppender = (wLogBinaryAppender*)calloc(1,
sizeof(wLogBinaryAppender));
226 BinaryAppender->common.Type = WLOG_APPENDER_BINARY;
227 BinaryAppender->common.Open = WLog_BinaryAppender_Open;
228 BinaryAppender->common.Close = WLog_BinaryAppender_Close;
229 BinaryAppender->common.WriteMessage = WLog_BinaryAppender_WriteMessage;
230 BinaryAppender->common.WriteDataMessage = WLog_BinaryAppender_WriteDataMessage;
231 BinaryAppender->common.WriteImageMessage = WLog_BinaryAppender_WriteImageMessage;
232 BinaryAppender->common.Free = WLog_BinaryAppender_Free;
233 BinaryAppender->common.Set = WLog_BinaryAppender_Set;
235 return &BinaryAppender->common;