Coverage Report

Created: 2024-03-08 06:32

/src/wget2/libwget/logger.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright (c) 2013 Tim Ruehsen
3
 * Copyright (c) 2015-2024 Free Software Foundation, Inc.
4
 *
5
 * This file is part of libwget.
6
 *
7
 * Libwget is free software: you can redistribute it and/or modify
8
 * it under the terms of the GNU Lesser General Public License as published by
9
 * the Free Software Foundation, either version 3 of the License, or
10
 * (at your option) any later version.
11
 *
12
 * Libwget is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 * GNU Lesser General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU Lesser General Public License
18
 * along with libwget.  If not, see <https://www.gnu.org/licenses/>.
19
 *
20
 *
21
 * Logger routines
22
 *
23
 * Changelog
24
 * 09.01.2013  Tim Ruehsen  created
25
 *
26
 */
27
28
#include <config.h>
29
30
#include <stdio.h>
31
#include <stdarg.h>
32
#include <errno.h>
33
34
#include <wget.h>
35
#include "private.h"
36
#include "logger.h"
37
38
static void WGET_GCC_PRINTF_FORMAT(2,0) WGET_GCC_NONNULL((1,2))
39
logger_vprintf_func(const wget_logger *logger, const char *fmt, va_list args)
40
0
{
41
0
  char sbuf[4096];
42
0
  wget_buffer buf;
43
0
  int err = errno;
44
45
0
  wget_buffer_init(&buf, sbuf, sizeof(sbuf));
46
0
  wget_buffer_vprintf(&buf, fmt, args);
47
0
  logger->func(buf.data, buf.length);
48
0
  wget_buffer_deinit(&buf);
49
50
0
  errno = err;
51
0
}
52
53
static void WGET_GCC_NONNULL((1))
54
logger_write_func(const wget_logger *logger, const char *buf, size_t len)
55
0
{
56
0
  logger->func(buf, len);
57
0
}
58
59
static void  WGET_GCC_PRINTF_FORMAT(2,0) WGET_GCC_NONNULL((1,2))
60
logger_vfprintf(FILE *fp, const char *fmt, va_list args)
61
0
{
62
0
  char sbuf[4096];
63
0
  wget_buffer buf;
64
0
  int err = errno;
65
66
0
  wget_buffer_init(&buf, sbuf, sizeof(sbuf));
67
0
  wget_buffer_vprintf(&buf, fmt, args);
68
0
  fwrite(buf.data, 1, buf.length, fp);
69
0
  wget_buffer_deinit(&buf);
70
71
0
  errno = err;
72
0
}
73
74
static void  WGET_GCC_PRINTF_FORMAT(2,0) WGET_GCC_NONNULL((1,2))
75
logger_vprintf_file(const wget_logger *logger, const char *fmt, va_list args)
76
0
{
77
0
  logger_vfprintf(logger->fp, fmt, args);
78
0
}
79
80
static void WGET_GCC_NONNULL((1))
81
logger_write_file(const wget_logger *logger, const char *buf, size_t len)
82
0
{
83
0
  fwrite(buf, 1, len, logger->fp);
84
0
}
85
86
static void WGET_GCC_PRINTF_FORMAT(2,0) WGET_GCC_NONNULL((1,2))
87
logger_vprintf_fname(const wget_logger *logger, const char *fmt, va_list args)
88
0
{
89
0
  FILE *fp = fopen(logger->fname, "a");
90
91
0
  if (fp) {
92
0
    logger_vfprintf(fp, fmt, args);
93
0
    fclose(fp);
94
0
  }
95
0
}
96
97
static void WGET_GCC_NONNULL((1))
98
logger_write_fname(const wget_logger *logger, const char *buf, size_t len)
99
0
{
100
0
  FILE *fp = fopen(logger->fname, "a");
101
102
0
  if (fp) {
103
0
    fwrite(buf, 1, len, fp);
104
0
    fclose(fp);
105
0
  }
106
0
}
107
108
void wget_logger_set_func(wget_logger *logger, wget_logger_func *func)
109
0
{
110
0
  if (logger) {
111
0
    logger->func = func;
112
0
    logger->vprintf = func ? logger_vprintf_func : NULL;
113
0
    logger->write = func ? logger_write_func : NULL;
114
0
  }
115
0
}
116
117
wget_logger_func *wget_logger_get_func(wget_logger *logger)
118
0
{
119
0
  return logger ? logger->func : NULL;
120
0
}
121
122
void wget_logger_set_stream(wget_logger *logger, FILE *fp)
123
0
{
124
0
  if (logger) {
125
0
    logger->fp = fp;
126
0
    logger->vprintf = fp ? logger_vprintf_file : NULL;
127
0
    logger->write = fp ? logger_write_file : NULL;
128
0
  }
129
0
}
130
131
FILE *wget_logger_get_stream(wget_logger *logger)
132
0
{
133
0
  return logger ? logger->fp : NULL;
134
0
}
135
136
void wget_logger_set_file(wget_logger *logger, const char *fname)
137
0
{
138
0
  if (logger) {
139
0
    logger->fname = fname;
140
0
    logger->vprintf = fname ? logger_vprintf_fname : NULL;
141
0
    logger->write = fname ? logger_write_fname : NULL;
142
0
  }
143
0
}
144
145
const char *wget_logger_get_file(wget_logger *logger)
146
0
{
147
0
  return logger ? logger->fname : NULL;
148
0
}
149
150
bool wget_logger_is_active(wget_logger *logger)
151
7.60k
{
152
7.60k
  return logger->vprintf != 0;
153
7.60k
}