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
0
{
26
0
  if (!appender)
27
0
    return;
28
29
0
  if (appender->Layout)
30
0
  {
31
0
    WLog_Layout_Free(log, appender->Layout);
32
0
    appender->Layout = NULL;
33
0
  }
34
35
0
  DeleteCriticalSection(&appender->lock);
36
0
  appender->Free(appender);
37
0
}
38
39
wLogAppender* WLog_GetLogAppender(wLog* log)
40
0
{
41
0
  if (!log)
42
0
    return NULL;
43
44
0
  if (!log->Appender)
45
0
    return WLog_GetLogAppender(log->Parent);
46
47
0
  return log->Appender;
48
0
}
49
50
BOOL WLog_OpenAppender(wLog* log)
51
0
{
52
0
  int status = 0;
53
0
  wLogAppender* appender = NULL;
54
55
0
  appender = WLog_GetLogAppender(log);
56
57
0
  if (!appender)
58
0
    return FALSE;
59
60
0
  if (!appender->Open)
61
0
    return TRUE;
62
63
0
  if (!appender->active)
64
0
  {
65
0
    status = appender->Open(log, appender);
66
0
    appender->active = TRUE;
67
0
  }
68
69
0
  return status;
70
0
}
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
0
{
96
0
  wLogAppender* appender = NULL;
97
98
0
  if (!log)
99
0
    return NULL;
100
101
0
  switch (logAppenderType)
102
0
  {
103
0
    case WLOG_APPENDER_CONSOLE:
104
0
      appender = WLog_ConsoleAppender_New(log);
105
0
      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
0
  }
134
135
0
  if (!appender)
136
0
    appender = WLog_ConsoleAppender_New(log);
137
138
0
  if (!appender)
139
0
    return NULL;
140
141
0
  if (!(appender->Layout = WLog_Layout_New(log)))
142
0
  {
143
0
    WLog_Appender_Free(log, appender);
144
0
    return NULL;
145
0
  }
146
147
0
  InitializeCriticalSectionAndSpinCount(&appender->lock, 4000);
148
149
0
  return appender;
150
0
}
151
152
BOOL WLog_SetLogAppenderType(wLog* log, DWORD logAppenderType)
153
0
{
154
0
  if (!log)
155
0
    return FALSE;
156
157
0
  if (log->Appender)
158
0
  {
159
0
    WLog_Appender_Free(log, log->Appender);
160
0
    log->Appender = NULL;
161
0
  }
162
163
0
  log->Appender = WLog_Appender_New(log, logAppenderType);
164
0
  return log->Appender != NULL;
165
0
}
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
}