]> git.proxmox.com Git - mirror_frr.git/blame - lib/log_filter.c
Merge pull request #13649 from donaldsharp/unlock_the_node_or_else
[mirror_frr.git] / lib / log_filter.c
CommitLineData
acddc0ed 1// SPDX-License-Identifier: GPL-2.0-or-later
1c408628
DL
2/*
3 * Logging - Filtered file log target
4 * Copyright (C) 2019 Cumulus Networks, Inc.
5 * Stephen Worley
1c408628
DL
6 */
7
8#include <zebra.h>
9
10#include "frr_pthread.h"
11#include "log.h"
12
13static pthread_mutex_t logfilterlock = PTHREAD_MUTEX_INITIALIZER;
14static char zlog_filters[ZLOG_FILTERS_MAX][ZLOG_FILTER_LENGTH_MAX + 1];
15static uint8_t zlog_filter_count;
16
17/*
18 * look for a match on the filter in the current filters,
19 * logfilterlock must be held
20 */
21static int zlog_filter_lookup(const char *lookup)
22{
23 for (int i = 0; i < zlog_filter_count; i++) {
24 if (strncmp(lookup, zlog_filters[i], sizeof(zlog_filters[0]))
25 == 0)
26 return i;
27 }
28 return -1;
29}
30
31void zlog_filter_clear(void)
32{
cb1991af 33 frr_with_mutex (&logfilterlock) {
1c408628
DL
34 zlog_filter_count = 0;
35 }
36}
37
38int zlog_filter_add(const char *filter)
39{
cb1991af 40 frr_with_mutex (&logfilterlock) {
1c408628
DL
41 if (zlog_filter_count >= ZLOG_FILTERS_MAX)
42 return 1;
43
44 if (zlog_filter_lookup(filter) != -1)
45 /* Filter already present */
46 return -1;
47
48 strlcpy(zlog_filters[zlog_filter_count], filter,
49 sizeof(zlog_filters[0]));
50
51 if (zlog_filters[zlog_filter_count][0] == '\0')
52 /* Filter was either empty or didn't get copied
53 * correctly
54 */
55 return -1;
56
57 zlog_filter_count++;
58 }
59 return 0;
60}
61
62int zlog_filter_del(const char *filter)
63{
cb1991af 64 frr_with_mutex (&logfilterlock) {
1c408628
DL
65 int found_idx = zlog_filter_lookup(filter);
66 int last_idx = zlog_filter_count - 1;
67
68 if (found_idx == -1)
69 /* Didn't find the filter to delete */
70 return -1;
71
72 /* Adjust the filter array */
73 memmove(zlog_filters[found_idx], zlog_filters[found_idx + 1],
74 (last_idx - found_idx) * sizeof(zlog_filters[0]));
75
76 zlog_filter_count--;
77 }
78 return 0;
79}
80
81/* Dump all filters to buffer, delimited by new line */
82int zlog_filter_dump(char *buf, size_t max_size)
83{
84 int len = 0;
85
cb1991af 86 frr_with_mutex (&logfilterlock) {
1c408628
DL
87 for (int i = 0; i < zlog_filter_count; i++) {
88 int ret;
89
90 ret = snprintf(buf + len, max_size - len, " %s\n",
91 zlog_filters[i]);
92 len += ret;
93 if ((ret < 0) || ((size_t)len >= max_size))
94 return -1;
95 }
96 }
97
98 return len;
99}
100
8b94cb43 101static int search_buf(const char *buf, size_t len)
1c408628
DL
102{
103 char *found = NULL;
104
cb1991af 105 frr_with_mutex (&logfilterlock) {
1c408628 106 for (int i = 0; i < zlog_filter_count; i++) {
8b94cb43
DL
107 found = memmem(buf, len, zlog_filters[i],
108 strlen(zlog_filters[i]));
1c408628
DL
109 if (found != NULL)
110 return 0;
111 }
112 }
113
114 return -1;
115}
116
117static void zlog_filterfile_fd(struct zlog_target *zt, struct zlog_msg *msgs[],
118 size_t nmsgs)
119{
120 struct zlog_msg *msgfilt[nmsgs];
121 size_t i, o = 0;
8b94cb43
DL
122 const char *text;
123 size_t text_len;
1c408628
DL
124
125 for (i = 0; i < nmsgs; i++) {
8b94cb43
DL
126 if (zlog_msg_prio(msgs[i]) >= LOG_DEBUG) {
127 text = zlog_msg_text(msgs[i], &text_len);
128 if (search_buf(text, text_len) < 0)
129 continue;
130 }
1c408628
DL
131 msgfilt[o++] = msgs[i];
132 }
133
134 if (o)
135 zlog_fd(zt, msgfilt, o);
136}
137
138void zlog_filterfile_init(struct zlog_cfg_filterfile *zcf)
139{
140 zlog_file_init(&zcf->parent);
141 zcf->parent.zlog_wrap = zlog_filterfile_fd;
142}
143
144void zlog_filterfile_fini(struct zlog_cfg_filterfile *zcf)
145{
146 zlog_file_fini(&zcf->parent);
147}