Coverage Report

Created: 2025-07-01 06:46

/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
1
{
26
1
  if (!appender)
27
0
    return;
28
29
1
  if (appender->Layout)
30
1
  {
31
1
    WLog_Layout_Free(log, appender->Layout);
32
1
    appender->Layout = NULL;
33
1
  }
34
35
1
  DeleteCriticalSection(&appender->lock);
36
1
  appender->Free(appender);
37
1
}
38
39
wLogAppender* WLog_GetLogAppender(wLog* log)
40
2.03k
{
41
2.03k
  if (!log)
42
0
    return NULL;
43
44
2.03k
  if (!log->Appender)
45
1.01k
    return WLog_GetLogAppender(log->Parent);
46
47
1.01k
  return log->Appender;
48
2.03k
}
49
50
BOOL WLog_OpenAppender(wLog* log)
51
1
{
52
1
  int status = 0;
53
1
  wLogAppender* appender = NULL;
54
55
1
  appender = WLog_GetLogAppender(log);
56
57
1
  if (!appender)
58
0
    return FALSE;
59
60
1
  if (!appender->Open)
61
0
    return TRUE;
62
63
1
  if (!appender->active)
64
1
  {
65
1
    status = appender->Open(log, appender);
66
1
    appender->active = TRUE;
67
1
  }
68
69
1
  return status;
70
1
}
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
1
{
96
1
  wLogAppender* appender = NULL;
97
98
1
  if (!log)
99
0
    return NULL;
100
101
1
  switch (logAppenderType)
102
1
  {
103
1
    case WLOG_APPENDER_CONSOLE:
104
1
      appender = WLog_ConsoleAppender_New(log);
105
1
      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 = WLog_UdpAppender_New(log);
127
0
      break;
128
0
    default:
129
0
      (void)fprintf(stderr, "%s: unknown handler type %" PRIu32 "\n", __func__,
130
0
                    logAppenderType);
131
0
      appender = NULL;
132
0
      break;
133
1
  }
134
135
1
  if (!appender)
136
0
    appender = WLog_ConsoleAppender_New(log);
137
138
1
  if (!appender)
139
0
    return NULL;
140
141
1
  if (!(appender->Layout = WLog_Layout_New(log)))
142
0
  {
143
0
    WLog_Appender_Free(log, appender);
144
0
    return NULL;
145
0
  }
146
147
1
  InitializeCriticalSectionAndSpinCount(&appender->lock, 4000);
148
149
1
  return appender;
150
1
}
151
152
BOOL WLog_SetLogAppenderType(wLog* log, DWORD logAppenderType)
153
1
{
154
1
  if (!log)
155
0
    return FALSE;
156
157
1
  if (log->Appender)
158
0
  {
159
0
    WLog_Appender_Free(log, log->Appender);
160
0
    log->Appender = NULL;
161
0
  }
162
163
1
  log->Appender = WLog_Appender_New(log, logAppenderType);
164
1
  return log->Appender != NULL;
165
1
}
166
167
BOOL WLog_ConfigureAppender(wLogAppender* appender, const char* setting, void* value)
168
0
{
169
  /* Just check the settings string is not empty */
170
0
  if (!appender || !setting || (strnlen(setting, 2) == 0))
171
0
    return FALSE;
172
173
0
  if (appender->Set)
174
0
    return appender->Set(appender, setting, value);
175
0
  else
176
0
    return FALSE;
177
0
}