FreeRDP
Loading...
Searching...
No Matches
BinaryAppender.c
1
22#include <winpr/config.h>
23
24#include "BinaryAppender.h"
25#include <winpr/crt.h>
26#include <winpr/assert.h>
27#include <winpr/file.h>
28#include <winpr/path.h>
29#include <winpr/stream.h>
30
31typedef struct
32{
33 WLOG_APPENDER_COMMON();
34
35 char* FileName;
36 char* FilePath;
37 char* FullFileName;
38 FILE* FileDescriptor;
39} wLogBinaryAppender;
40
41static BOOL WLog_BinaryAppender_Open(wLog* log, wLogAppender* appender)
42{
43 wLogBinaryAppender* binaryAppender = NULL;
44 if (!log || !appender)
45 return FALSE;
46
47 binaryAppender = (wLogBinaryAppender*)appender;
48 if (!binaryAppender->FileName)
49 {
50 binaryAppender->FileName = (char*)malloc(MAX_PATH);
51 if (!binaryAppender->FileName)
52 return FALSE;
53 (void)sprintf_s(binaryAppender->FileName, MAX_PATH, "%" PRIu32 ".wlog",
54 GetCurrentProcessId());
55 }
56
57 if (!binaryAppender->FilePath)
58 {
59 binaryAppender->FilePath = GetKnownSubPath(KNOWN_PATH_TEMP, "wlog");
60 if (!binaryAppender->FilePath)
61 return FALSE;
62 }
63
64 if (!binaryAppender->FullFileName)
65 {
66 binaryAppender->FullFileName =
67 GetCombinedPath(binaryAppender->FilePath, binaryAppender->FileName);
68 if (!binaryAppender->FullFileName)
69 return FALSE;
70 }
71
72 if (!winpr_PathFileExists(binaryAppender->FilePath))
73 {
74 if (!winpr_PathMakePath(binaryAppender->FilePath, 0))
75 return FALSE;
76 UnixChangeFileMode(binaryAppender->FilePath, 0xFFFF);
77 }
78
79 binaryAppender->FileDescriptor = winpr_fopen(binaryAppender->FullFileName, "a+");
80
81 if (!binaryAppender->FileDescriptor)
82 return FALSE;
83
84 return TRUE;
85}
86
87static BOOL WLog_BinaryAppender_Close(WINPR_ATTR_UNUSED wLog* log, wLogAppender* appender)
88{
89 wLogBinaryAppender* binaryAppender = NULL;
90
91 if (!appender)
92 return FALSE;
93
94 binaryAppender = (wLogBinaryAppender*)appender;
95 if (!binaryAppender->FileDescriptor)
96 return TRUE;
97
98 if (binaryAppender->FileDescriptor)
99 (void)fclose(binaryAppender->FileDescriptor);
100
101 binaryAppender->FileDescriptor = NULL;
102
103 return TRUE;
104}
105
106static BOOL WLog_BinaryAppender_WriteMessage(wLog* log, wLogAppender* appender,
107 wLogMessage* message)
108{
109 FILE* fp = NULL;
110 wStream* s = NULL;
111 size_t MessageLength = 0;
112 size_t FileNameLength = 0;
113 size_t FunctionNameLength = 0;
114 size_t TextStringLength = 0;
115 BOOL ret = TRUE;
116 wLogBinaryAppender* binaryAppender = NULL;
117
118 if (!log || !appender || !message)
119 return FALSE;
120
121 binaryAppender = (wLogBinaryAppender*)appender;
122
123 fp = binaryAppender->FileDescriptor;
124
125 if (!fp)
126 return FALSE;
127
128 FileNameLength = strnlen(message->FileName, INT_MAX);
129 FunctionNameLength = strnlen(message->FunctionName, INT_MAX);
130 TextStringLength = strnlen(message->TextString, INT_MAX);
131
132 MessageLength =
133 16 + (4 + FileNameLength + 1) + (4 + FunctionNameLength + 1) + (4 + TextStringLength + 1);
134
135 if ((MessageLength > UINT32_MAX) || (FileNameLength > UINT32_MAX) ||
136 (FunctionNameLength > UINT32_MAX) || (TextStringLength > UINT32_MAX))
137 return FALSE;
138
139 s = Stream_New(NULL, MessageLength);
140 if (!s)
141 return FALSE;
142
143 Stream_Write_UINT32(s, (UINT32)MessageLength);
144
145 Stream_Write_UINT32(s, message->Type);
146 Stream_Write_UINT32(s, message->Level);
147
148 WINPR_ASSERT(message->LineNumber <= UINT32_MAX);
149 Stream_Write_UINT32(s, (UINT32)message->LineNumber);
150
151 Stream_Write_UINT32(s, (UINT32)FileNameLength);
152 Stream_Write(s, message->FileName, FileNameLength + 1);
153
154 Stream_Write_UINT32(s, (UINT32)FunctionNameLength);
155 Stream_Write(s, message->FunctionName, FunctionNameLength + 1);
156
157 Stream_Write_UINT32(s, (UINT32)TextStringLength);
158 Stream_Write(s, message->TextString, TextStringLength + 1);
159
160 Stream_SealLength(s);
161
162 if (fwrite(Stream_Buffer(s), MessageLength, 1, fp) != 1)
163 ret = FALSE;
164
165 Stream_Free(s, TRUE);
166
167 return ret;
168}
169
170static BOOL WLog_BinaryAppender_WriteDataMessage(WINPR_ATTR_UNUSED wLog* log,
171 WINPR_ATTR_UNUSED wLogAppender* appender,
172 WINPR_ATTR_UNUSED wLogMessage* message)
173{
174 return TRUE;
175}
176
177static BOOL WLog_BinaryAppender_WriteImageMessage(WINPR_ATTR_UNUSED wLog* log,
178 WINPR_ATTR_UNUSED wLogAppender* appender,
179 WINPR_ATTR_UNUSED wLogMessage* message)
180{
181 return TRUE;
182}
183
184static BOOL WLog_BinaryAppender_Set(wLogAppender* appender, const char* setting, void* value)
185{
186 wLogBinaryAppender* binaryAppender = (wLogBinaryAppender*)appender;
187
188 /* Just check if the value string is longer than 0 */
189 if (!value || (strnlen(value, 2) == 0))
190 return FALSE;
191
192 if (!strcmp("outputfilename", setting))
193 {
194 binaryAppender->FileName = _strdup((const char*)value);
195 if (!binaryAppender->FileName)
196 return FALSE;
197 }
198 else if (!strcmp("outputfilepath", setting))
199 {
200 binaryAppender->FilePath = _strdup((const char*)value);
201 if (!binaryAppender->FilePath)
202 return FALSE;
203 }
204 else
205 return FALSE;
206
207 return TRUE;
208}
209
210static void WLog_BinaryAppender_Free(wLogAppender* appender)
211{
212 wLogBinaryAppender* binaryAppender = NULL;
213 if (appender)
214 {
215 binaryAppender = (wLogBinaryAppender*)appender;
216 free(binaryAppender->FileName);
217 free(binaryAppender->FilePath);
218 free(binaryAppender->FullFileName);
219 free(binaryAppender);
220 }
221}
222
223wLogAppender* WLog_BinaryAppender_New(WINPR_ATTR_UNUSED wLog* log)
224{
225 wLogBinaryAppender* BinaryAppender = NULL;
226
227 BinaryAppender = (wLogBinaryAppender*)calloc(1, sizeof(wLogBinaryAppender));
228 if (!BinaryAppender)
229 return NULL;
230
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;
239
240 return (wLogAppender*)BinaryAppender;
241}