2013-10-02 21:38:21 +04:00
|
|
|
/**
|
|
|
|
* WinPR: Windows Portable Runtime
|
|
|
|
* WinPR Logger
|
|
|
|
*
|
|
|
|
* Copyright 2013 Marc-Andre Moreau <marcandre.moreau@gmail.com>
|
2015-05-29 14:46:50 +03:00
|
|
|
* Copyright 2015 Thincast Technologies GmbH
|
|
|
|
* Copyright 2015 DI (FH) Martin Haimberger <martin.haimberger@thincast.com>
|
2013-10-02 21:38:21 +04:00
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
#include "config.h"
|
|
|
|
#endif
|
|
|
|
|
2015-11-09 19:56:44 +03:00
|
|
|
#include "BinaryAppender.h"
|
2013-10-02 21:38:21 +04:00
|
|
|
#include <winpr/crt.h>
|
|
|
|
#include <winpr/file.h>
|
|
|
|
#include <winpr/path.h>
|
2013-10-04 19:33:49 +04:00
|
|
|
#include <winpr/stream.h>
|
2013-10-02 21:38:21 +04:00
|
|
|
|
2013-10-09 03:39:03 +04:00
|
|
|
|
2015-11-09 19:56:44 +03:00
|
|
|
struct _wLogBinaryAppender
|
2013-10-02 21:38:21 +04:00
|
|
|
{
|
2015-11-09 19:56:44 +03:00
|
|
|
WLOG_APPENDER_COMMON();
|
2013-10-02 21:38:21 +04:00
|
|
|
|
2015-11-09 19:56:44 +03:00
|
|
|
char* FileName;
|
|
|
|
char* FilePath;
|
|
|
|
char* FullFileName;
|
|
|
|
FILE* FileDescriptor;
|
|
|
|
};
|
|
|
|
typedef struct _wLogBinaryAppender wLogBinaryAppender;
|
2013-10-02 21:38:21 +04:00
|
|
|
|
2015-11-09 19:56:44 +03:00
|
|
|
static BOOL WLog_BinaryAppender_Open(wLog* log, wLogAppender* appender)
|
2013-10-02 21:38:21 +04:00
|
|
|
{
|
2015-11-09 19:56:44 +03:00
|
|
|
wLogBinaryAppender* binaryAppender;
|
2014-08-14 12:38:02 +04:00
|
|
|
if (!log || !appender)
|
2015-10-21 11:11:06 +03:00
|
|
|
return FALSE;
|
2014-08-14 12:38:02 +04:00
|
|
|
|
2015-11-09 19:56:44 +03:00
|
|
|
binaryAppender = (wLogBinaryAppender *)appender;
|
|
|
|
if (!binaryAppender->FileName)
|
2013-10-02 21:38:21 +04:00
|
|
|
{
|
2015-11-09 19:56:44 +03:00
|
|
|
binaryAppender->FileName = (char*) malloc(MAX_PATH);
|
|
|
|
if (!binaryAppender->FileName)
|
2015-10-21 11:11:06 +03:00
|
|
|
return FALSE;
|
2015-11-09 19:56:44 +03:00
|
|
|
sprintf_s(binaryAppender->FileName, MAX_PATH, "%u.wlog", (unsigned int) GetCurrentProcessId());
|
2013-10-02 21:38:21 +04:00
|
|
|
}
|
|
|
|
|
2015-11-09 19:56:44 +03:00
|
|
|
if (!binaryAppender->FilePath)
|
2013-10-02 21:38:21 +04:00
|
|
|
{
|
2015-11-09 19:56:44 +03:00
|
|
|
binaryAppender->FilePath = GetKnownSubPath(KNOWN_PATH_TEMP, "wlog");
|
|
|
|
if (!binaryAppender->FilePath)
|
2015-10-21 11:11:06 +03:00
|
|
|
return FALSE;
|
2013-10-02 21:38:21 +04:00
|
|
|
}
|
|
|
|
|
2015-11-09 19:56:44 +03:00
|
|
|
if (!binaryAppender->FullFileName)
|
2013-10-02 21:38:21 +04:00
|
|
|
{
|
2015-11-09 19:56:44 +03:00
|
|
|
binaryAppender->FullFileName = GetCombinedPath(binaryAppender->FilePath, binaryAppender->FileName);
|
|
|
|
if (!binaryAppender->FullFileName)
|
2015-10-21 11:11:06 +03:00
|
|
|
return FALSE;
|
2013-10-02 21:38:21 +04:00
|
|
|
}
|
|
|
|
|
2015-11-09 19:56:44 +03:00
|
|
|
if (!PathFileExistsA(binaryAppender->FilePath))
|
2013-10-02 21:38:21 +04:00
|
|
|
{
|
2015-11-09 19:56:44 +03:00
|
|
|
if (!PathMakePathA(binaryAppender->FilePath, 0))
|
2015-10-21 11:11:06 +03:00
|
|
|
return FALSE;
|
2015-11-09 19:56:44 +03:00
|
|
|
UnixChangeFileMode(binaryAppender->FilePath, 0xFFFF);
|
2013-10-02 21:38:21 +04:00
|
|
|
}
|
|
|
|
|
2015-11-09 19:56:44 +03:00
|
|
|
binaryAppender->FileDescriptor = fopen(binaryAppender->FullFileName, "a+");
|
2013-10-02 21:38:21 +04:00
|
|
|
|
2015-11-09 19:56:44 +03:00
|
|
|
if (!binaryAppender->FileDescriptor)
|
2015-10-21 11:11:06 +03:00
|
|
|
return FALSE;
|
2013-10-02 21:38:21 +04:00
|
|
|
|
2015-10-21 11:11:06 +03:00
|
|
|
return TRUE;
|
2013-10-02 21:38:21 +04:00
|
|
|
}
|
|
|
|
|
2015-11-09 19:56:44 +03:00
|
|
|
static BOOL WLog_BinaryAppender_Close(wLog* log, wLogAppender* appender)
|
2013-10-02 21:38:21 +04:00
|
|
|
{
|
2015-11-09 19:56:44 +03:00
|
|
|
wLogBinaryAppender* binaryAppender;
|
|
|
|
|
|
|
|
if (!appender)
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
binaryAppender = (wLogBinaryAppender *)appender;
|
|
|
|
if (!binaryAppender->FileDescriptor)
|
2015-10-21 11:11:06 +03:00
|
|
|
return TRUE;
|
2013-10-02 21:38:21 +04:00
|
|
|
|
2015-11-09 19:56:44 +03:00
|
|
|
fclose(binaryAppender->FileDescriptor);
|
2013-10-02 21:38:21 +04:00
|
|
|
|
2015-11-09 19:56:44 +03:00
|
|
|
binaryAppender->FileDescriptor = NULL;
|
2013-10-02 21:38:21 +04:00
|
|
|
|
2015-10-21 11:11:06 +03:00
|
|
|
return TRUE;
|
2013-10-02 21:38:21 +04:00
|
|
|
}
|
|
|
|
|
2015-11-09 19:56:44 +03:00
|
|
|
static BOOL WLog_BinaryAppender_WriteMessage(wLog* log, wLogAppender* appender, wLogMessage* message)
|
2013-10-02 21:38:21 +04:00
|
|
|
{
|
|
|
|
FILE* fp;
|
2013-10-04 19:33:49 +04:00
|
|
|
wStream* s;
|
|
|
|
int MessageLength;
|
|
|
|
int FileNameLength;
|
|
|
|
int FunctionNameLength;
|
|
|
|
int TextStringLength;
|
2015-10-21 11:11:06 +03:00
|
|
|
BOOL ret = TRUE;
|
2015-11-09 19:56:44 +03:00
|
|
|
wLogBinaryAppender* binaryAppender;
|
2013-10-02 21:38:21 +04:00
|
|
|
|
2014-08-14 12:38:02 +04:00
|
|
|
if (!log || !appender || !message)
|
2015-10-21 11:11:06 +03:00
|
|
|
return FALSE;
|
2014-08-14 12:38:02 +04:00
|
|
|
|
2015-11-09 19:56:44 +03:00
|
|
|
binaryAppender = (wLogBinaryAppender *)appender;
|
|
|
|
|
|
|
|
fp = binaryAppender->FileDescriptor;
|
2013-10-02 21:38:21 +04:00
|
|
|
|
|
|
|
if (!fp)
|
2015-10-21 11:11:06 +03:00
|
|
|
return FALSE;
|
2013-10-02 21:38:21 +04:00
|
|
|
|
2013-10-04 19:33:49 +04:00
|
|
|
FileNameLength = strlen(message->FileName);
|
|
|
|
FunctionNameLength = strlen(message->FunctionName);
|
|
|
|
TextStringLength = strlen(message->TextString);
|
2013-10-02 21:38:21 +04:00
|
|
|
|
2013-10-04 19:33:49 +04:00
|
|
|
MessageLength = 16 +
|
|
|
|
(4 + FileNameLength + 1) +
|
|
|
|
(4 + FunctionNameLength + 1) +
|
|
|
|
(4 + TextStringLength + 1);
|
|
|
|
|
|
|
|
s = Stream_New(NULL, MessageLength);
|
2015-05-29 14:46:50 +03:00
|
|
|
if (!s)
|
2015-10-21 11:11:06 +03:00
|
|
|
return FALSE;
|
2013-10-04 19:33:49 +04:00
|
|
|
|
|
|
|
Stream_Write_UINT32(s, MessageLength);
|
|
|
|
|
|
|
|
Stream_Write_UINT32(s, message->Type);
|
|
|
|
Stream_Write_UINT32(s, message->Level);
|
|
|
|
|
|
|
|
Stream_Write_UINT32(s, message->LineNumber);
|
|
|
|
|
|
|
|
Stream_Write_UINT32(s, FileNameLength);
|
|
|
|
Stream_Write(s, message->FileName, FileNameLength + 1);
|
|
|
|
|
|
|
|
Stream_Write_UINT32(s, FunctionNameLength);
|
|
|
|
Stream_Write(s, message->FunctionName, FunctionNameLength + 1);
|
|
|
|
|
|
|
|
Stream_Write_UINT32(s, TextStringLength);
|
|
|
|
Stream_Write(s, message->TextString, TextStringLength + 1);
|
|
|
|
|
|
|
|
Stream_SealLength(s);
|
|
|
|
|
2015-06-26 16:58:01 +03:00
|
|
|
if (fwrite(Stream_Buffer(s), MessageLength, 1, fp) != 1)
|
2015-10-21 11:11:06 +03:00
|
|
|
ret = FALSE;
|
2013-10-04 19:33:49 +04:00
|
|
|
|
|
|
|
Stream_Free(s, TRUE);
|
2013-10-02 21:38:21 +04:00
|
|
|
|
2015-06-26 16:58:01 +03:00
|
|
|
return ret;
|
2013-10-02 21:38:21 +04:00
|
|
|
}
|
|
|
|
|
2015-11-09 19:56:44 +03:00
|
|
|
static BOOL WLog_BinaryAppender_WriteDataMessage(wLog* log, wLogAppender* appender, wLogMessage* message)
|
2013-10-02 23:41:46 +04:00
|
|
|
{
|
2015-10-21 11:11:06 +03:00
|
|
|
return TRUE;
|
2013-10-02 23:41:46 +04:00
|
|
|
}
|
|
|
|
|
2015-11-09 19:56:44 +03:00
|
|
|
static BOOL WLog_BinaryAppender_WriteImageMessage(wLog* log, wLogAppender* appender, wLogMessage* message)
|
2013-10-02 23:41:46 +04:00
|
|
|
{
|
2015-10-21 11:11:06 +03:00
|
|
|
return TRUE;
|
2013-10-02 23:41:46 +04:00
|
|
|
}
|
|
|
|
|
2015-11-09 19:56:44 +03:00
|
|
|
static BOOL WLog_BinaryAppender_Set(wLogAppender* appender, const char *setting, void *value)
|
2013-10-02 21:38:21 +04:00
|
|
|
{
|
2015-11-09 19:56:44 +03:00
|
|
|
wLogBinaryAppender *binaryAppender = (wLogBinaryAppender *) appender;
|
2013-10-02 21:38:21 +04:00
|
|
|
|
2015-11-09 19:56:44 +03:00
|
|
|
if (!value || !strlen(value))
|
|
|
|
return FALSE;
|
2015-06-14 01:55:09 +03:00
|
|
|
|
2015-11-09 19:56:44 +03:00
|
|
|
if (!strcmp("outputfilename", setting))
|
|
|
|
{
|
|
|
|
binaryAppender->FileName = _strdup((const char *)value);
|
|
|
|
if (!binaryAppender->FileName)
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
else if (!strcmp("outputfilepath", setting))
|
|
|
|
{
|
|
|
|
binaryAppender->FilePath = _strdup((const char *)value);
|
|
|
|
if (!binaryAppender->FilePath)
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
return TRUE;
|
2013-10-02 21:38:21 +04:00
|
|
|
}
|
|
|
|
|
2015-11-09 19:56:44 +03:00
|
|
|
static void WLog_BinaryAppender_Free(wLogAppender* appender)
|
2013-10-02 21:38:21 +04:00
|
|
|
{
|
2015-11-09 19:56:44 +03:00
|
|
|
wLogBinaryAppender *binaryAppender;
|
2013-10-02 21:38:21 +04:00
|
|
|
if (appender)
|
|
|
|
{
|
2015-11-09 19:56:44 +03:00
|
|
|
binaryAppender = (wLogBinaryAppender *)appender;
|
|
|
|
free(binaryAppender->FileName);
|
|
|
|
free(binaryAppender->FilePath);
|
|
|
|
free(binaryAppender->FullFileName);
|
|
|
|
free(binaryAppender);
|
2013-10-02 21:38:21 +04:00
|
|
|
}
|
|
|
|
}
|
2015-11-09 19:56:44 +03:00
|
|
|
|
|
|
|
wLogAppender* WLog_BinaryAppender_New(wLog* log)
|
|
|
|
{
|
|
|
|
wLogBinaryAppender* BinaryAppender;
|
|
|
|
|
|
|
|
BinaryAppender = (wLogBinaryAppender*) calloc(1, sizeof(wLogBinaryAppender));
|
|
|
|
if (!BinaryAppender)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
BinaryAppender->Type = WLOG_APPENDER_BINARY;
|
|
|
|
BinaryAppender->Open = WLog_BinaryAppender_Open;
|
|
|
|
BinaryAppender->Close = WLog_BinaryAppender_Close;
|
|
|
|
BinaryAppender->WriteMessage = WLog_BinaryAppender_WriteMessage;
|
|
|
|
BinaryAppender->WriteDataMessage = WLog_BinaryAppender_WriteDataMessage;
|
|
|
|
BinaryAppender->WriteImageMessage = WLog_BinaryAppender_WriteImageMessage;
|
|
|
|
BinaryAppender->Free = WLog_BinaryAppender_Free;
|
|
|
|
BinaryAppender->Set = WLog_BinaryAppender_Set;
|
|
|
|
|
|
|
|
return (wLogAppender *)BinaryAppender;
|
|
|
|
}
|