Coverage Report

Created: 2024-05-20 06:11

/src/FreeRDP/winpr/libwinpr/utils/wlog/Appender.c
Line
Count
Source (jump to first uncovered line)
1
/**
2
 * WinPR: Windows Portable Runtime
3
 * WinPR Logger
4
 *
5
 * Copyright 2013 Marc-Andre Moreau <marcandre.moreau@gmail.com>
6
 *
7
 * Licensed under the Apache License, Version 2.0 (the "License");
8
 * you may not use this file except in compliance with the License.
9
 * You may obtain a copy of the License at
10
 *
11
 *     http://www.apache.org/licenses/LICENSE-2.0
12
 *
13
 * Unless required by applicable law or agreed to in writing, software
14
 * distributed under the License is distributed on an "AS IS" BASIS,
15
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
 * See the License for the specific language governing permissions and
17
 * limitations under the License.
18
 */
19
20
#include <winpr/config.h>
21
22
#include "Appender.h"
23
24
void WLog_Appender_Free(wLog* log, wLogAppender* appender)
25
5
{
26
5
  if (!appender)
27
0
    return;
28
29
5
  if (appender->Layout)
30
5
  {
31
5
    WLog_Layout_Free(log, appender->Layout);
32
5
    appender->Layout = NULL;
33
5
  }
34
35
5
  DeleteCriticalSection(&appender->lock);
36
5
  appender->Free(appender);
37
5
}
38
39
wLogAppender* WLog_GetLogAppender(wLog* log)
40
13.8M
{
41
13.8M
  if (!log)
42
0
    return NULL;
43
44
13.8M
  if (!log->Appender)
45
6.94M
    return WLog_GetLogAppender(log->Parent);
46
47
6.94M
  return log->Appender;
48
13.8M
}
49
50
BOOL WLog_OpenAppender(wLog* log)
51
28.5k
{
52
28.5k
  int status = 0;
53
28.5k
  wLogAppender* appender = NULL;
54
55
28.5k
  appender = WLog_GetLogAppender(log);
56
57
28.5k
  if (!appender)
58
0
    return FALSE;
59
60
28.5k
  if (!appender->Open)
61
0
    return TRUE;
62
63
28.5k
  if (!appender->active)
64
5
  {
65
5
    status = appender->Open(log, appender);
66
5
    appender->active = TRUE;
67
5
  }
68
69
28.5k
  return status;
70
28.5k
}
71
72
BOOL WLog_CloseAppender(wLog* log)
73
0
{
74
0
  int status = 0;
75
0
  wLogAppender* appender = NULL;
76
77
0
  appender = WLog_GetLogAppender(log);
78
79
0
  if (!appender)
80
0
    return FALSE;
81
82
0
  if (!appender->Close)
83
0
    return TRUE;
84
85
0
  if (appender->active)
86
0
  {
87
0
    status = appender->Close(log, appender);
88
0
    appender->active = FALSE;
89
0
  }
90
91
0
  return status;
92
0
}
93
94
static wLogAppender* WLog_Appender_New(wLog* log, DWORD logAppenderType)
95
5
{
96
5
  wLogAppender* appender = NULL;
97
98
5
  if (!log)
99
0
    return NULL;
100
101
5
  switch (logAppenderType)
102
5
  {
103
5
    case WLOG_APPENDER_CONSOLE:
104
5
      appender = WLog_ConsoleAppender_New(log);
105
5
      break;
106
0
    case WLOG_APPENDER_FILE:
107
0
      appender = WLog_FileAppender_New(log);
108
0
      break;
109
0
    case WLOG_APPENDER_BINARY:
110
0
      appender = WLog_BinaryAppender_New(log);
111
0
      break;
112
0
    case WLOG_APPENDER_CALLBACK:
113
0
      appender = WLog_CallbackAppender_New(log);
114
0
      break;
115
0
#ifdef WINPR_HAVE_SYSLOG_H
116
0
    case WLOG_APPENDER_SYSLOG:
117
0
      appender = WLog_SyslogAppender_New(log);
118
0
      break;
119
0
#endif
120
#ifdef WINPR_HAVE_JOURNALD_H
121
    case WLOG_APPENDER_JOURNALD:
122
      appender = WLog_JournaldAppender_New(log);
123
      break;
124
#endif
125
0
    case WLOG_APPENDER_UDP:
126
0
      appender = (wLogAppender*)WLog_UdpAppender_New(log);
127
0
      break;
128
0
    default:
129
0
      fprintf(stderr, "%s: unknown handler type %" PRIu32 "\n", __func__, logAppenderType);
130
0
      appender = NULL;
131
0
      break;
132
5
  }
133
134
5
  if (!appender)
135
0
    appender = (wLogAppender*)WLog_ConsoleAppender_New(log);
136
137
5
  if (!appender)
138
0
    return NULL;
139
140
5
  if (!(appender->Layout = WLog_Layout_New(log)))
141
0
  {
142
0
    WLog_Appender_Free(log, appender);
143
0
    return NULL;
144
0
  }
145
146
5
  InitializeCriticalSectionAndSpinCount(&appender->lock, 4000);
147
148
5
  return appender;
149
5
}
150
151
BOOL WLog_SetLogAppenderType(wLog* log, DWORD logAppenderType)
152
5
{
153
5
  if (!log)
154
0
    return FALSE;
155
156
5
  if (log->Appender)
157
0
  {
158
0
    WLog_Appender_Free(log, log->Appender);
159
0
    log->Appender = NULL;
160
0
  }
161
162
5
  log->Appender = WLog_Appender_New(log, logAppenderType);
163
5
  return log->Appender != NULL;
164
5
}
165
166
BOOL WLog_ConfigureAppender(wLogAppender* appender, const char* setting, void* value)
167
0
{
168
  /* Just check the settings string is not empty */
169
0
  if (!appender || !setting || (strnlen(setting, 2) == 0))
170
0
    return FALSE;
171
172
0
  if (appender->Set)
173
0
    return appender->Set(appender, setting, value);
174
0
  else
175
0
    return FALSE;
176
0
}