lttng add-trigger: replace event rule type options with --type
[lttng-tools.git] / src / bin / lttng / loglevel.c
1 /*
2 * Copyright (C) 2021 Jérémie Galarneau <jeremie.galarneau@efficios.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 *
6 */
7
8 #include "loglevel.h"
9 #include <string.h>
10 #include <strings.h>
11 #include <ctype.h>
12 #include <assert.h>
13
14 struct loglevel_name_value {
15 const char *name;
16 int value;
17 };
18
19 static
20 const struct loglevel_name_value loglevel_values[] = {
21 { .name = "EMERG", .value = LTTNG_LOGLEVEL_EMERG },
22 { .name = "TRACE_EMERG", .value = LTTNG_LOGLEVEL_EMERG },
23 { .name = "ALERT", .value = LTTNG_LOGLEVEL_ALERT },
24 { .name = "TRACE_ALERT", .value = LTTNG_LOGLEVEL_ALERT },
25 { .name = "CRIT", .value = LTTNG_LOGLEVEL_CRIT },
26 { .name = "TRACE_CRIT", .value = LTTNG_LOGLEVEL_CRIT },
27 { .name = "ERR", .value = LTTNG_LOGLEVEL_ERR },
28 { .name = "TRACE_ERR", .value = LTTNG_LOGLEVEL_ERR },
29 { .name = "WARNING", .value = LTTNG_LOGLEVEL_WARNING },
30 { .name = "TRACE_WARNING", .value = LTTNG_LOGLEVEL_WARNING },
31 { .name = "NOTICE", .value = LTTNG_LOGLEVEL_NOTICE },
32 { .name = "TRACE_NOTICE", .value = LTTNG_LOGLEVEL_NOTICE },
33 { .name = "INFO", .value = LTTNG_LOGLEVEL_INFO },
34 { .name = "TRACE_INFO", .value = LTTNG_LOGLEVEL_INFO },
35 { .name = "DEBUG_SYSTEM", .value = LTTNG_LOGLEVEL_DEBUG_SYSTEM },
36 { .name = "TRACE_DEBUG_SYSTEM", .value = LTTNG_LOGLEVEL_DEBUG_SYSTEM },
37 { .name = "SYSTEM", .value = LTTNG_LOGLEVEL_DEBUG_SYSTEM },
38 { .name = "DEBUG_PROGRAM", .value = LTTNG_LOGLEVEL_DEBUG_PROGRAM },
39 { .name = "TRACE_DEBUG_PROGRAM", .value = LTTNG_LOGLEVEL_DEBUG_PROGRAM },
40 { .name = "PROGRAM", .value = LTTNG_LOGLEVEL_DEBUG_PROGRAM },
41 { .name = "DEBUG_PROCESS", .value = LTTNG_LOGLEVEL_DEBUG_PROCESS },
42 { .name = "TRACE_DEBUG_PROCESS", .value = LTTNG_LOGLEVEL_DEBUG_PROCESS },
43 { .name = "PROCESS", .value = LTTNG_LOGLEVEL_DEBUG_PROCESS },
44 { .name = "DEBUG_MODULE", .value = LTTNG_LOGLEVEL_DEBUG_MODULE },
45 { .name = "TRACE_DEBUG_MODULE", .value = LTTNG_LOGLEVEL_DEBUG_MODULE },
46 { .name = "MODULE", .value = LTTNG_LOGLEVEL_DEBUG_MODULE },
47 { .name = "DEBUG_UNIT", .value = LTTNG_LOGLEVEL_DEBUG_UNIT },
48 { .name = "TRACE_DEBUG_UNIT", .value = LTTNG_LOGLEVEL_DEBUG_UNIT },
49 { .name = "UNIT", .value = LTTNG_LOGLEVEL_DEBUG_UNIT },
50 { .name = "DEBUG_FUNCTION", .value = LTTNG_LOGLEVEL_DEBUG_FUNCTION },
51 { .name = "TRACE_DEBUG_FUNCTION", .value = LTTNG_LOGLEVEL_DEBUG_FUNCTION },
52 { .name = "FUNCTION", .value = LTTNG_LOGLEVEL_DEBUG_FUNCTION },
53 { .name = "DEBUG_LINE", .value = LTTNG_LOGLEVEL_DEBUG_LINE },
54 { .name = "TRACE_DEBUG_LINE", .value = LTTNG_LOGLEVEL_DEBUG_LINE },
55 { .name = "LINE", .value = LTTNG_LOGLEVEL_DEBUG_LINE },
56 { .name = "DEBUG", .value = LTTNG_LOGLEVEL_DEBUG },
57 { .name = "TRACE_DEBUG", .value = LTTNG_LOGLEVEL_DEBUG },
58 };
59
60 static
61 const struct loglevel_name_value loglevel_log4j_values[] = {
62 { .name = "OFF", .value = LTTNG_LOGLEVEL_LOG4J_OFF },
63 { .name = "LOG4J_OFF", .value = LTTNG_LOGLEVEL_LOG4J_OFF },
64 { .name = "FATAL", .value = LTTNG_LOGLEVEL_LOG4J_FATAL },
65 { .name = "LOG4J_FATAL", .value = LTTNG_LOGLEVEL_LOG4J_FATAL },
66 { .name = "ERROR", .value = LTTNG_LOGLEVEL_LOG4J_ERROR },
67 { .name = "LOG4J_ERROR", .value = LTTNG_LOGLEVEL_LOG4J_ERROR },
68 { .name = "WARN", .value = LTTNG_LOGLEVEL_LOG4J_WARN },
69 { .name = "LOG4J_WARN", .value = LTTNG_LOGLEVEL_LOG4J_WARN },
70 { .name = "INFO", .value = LTTNG_LOGLEVEL_LOG4J_INFO },
71 { .name = "LOG4J_INFO", .value = LTTNG_LOGLEVEL_LOG4J_INFO },
72 { .name = "DEBUG", .value = LTTNG_LOGLEVEL_LOG4J_DEBUG },
73 { .name = "LOG4J_DEBUG", .value = LTTNG_LOGLEVEL_LOG4J_DEBUG },
74 { .name = "TRACE", .value = LTTNG_LOGLEVEL_LOG4J_TRACE },
75 { .name = "LOG4J_TRACE", .value = LTTNG_LOGLEVEL_LOG4J_TRACE },
76 { .name = "ALL", .value = LTTNG_LOGLEVEL_LOG4J_ALL },
77 { .name = "LOG4J_ALL", .value = LTTNG_LOGLEVEL_LOG4J_ALL },
78 };
79
80 static
81 const struct loglevel_name_value loglevel_jul_values[] = {
82 { .name = "OFF", .value = LTTNG_LOGLEVEL_JUL_OFF },
83 { .name = "JUL_OFF", .value = LTTNG_LOGLEVEL_JUL_OFF },
84 { .name = "SEVERE", .value = LTTNG_LOGLEVEL_JUL_SEVERE },
85 { .name = "JUL_SEVERE", .value = LTTNG_LOGLEVEL_JUL_SEVERE },
86 { .name = "WARNING", .value = LTTNG_LOGLEVEL_JUL_WARNING },
87 { .name = "JUL_WARNING", .value = LTTNG_LOGLEVEL_JUL_WARNING },
88 { .name = "INFO", .value = LTTNG_LOGLEVEL_JUL_INFO },
89 { .name = "JUL_INFO", .value = LTTNG_LOGLEVEL_JUL_INFO },
90 { .name = "CONFIG", .value = LTTNG_LOGLEVEL_JUL_CONFIG },
91 { .name = "JUL_CONFIG", .value = LTTNG_LOGLEVEL_JUL_CONFIG },
92 { .name = "FINE", .value = LTTNG_LOGLEVEL_JUL_FINE },
93 { .name = "JUL_FINE", .value = LTTNG_LOGLEVEL_JUL_FINE },
94 { .name = "FINER", .value = LTTNG_LOGLEVEL_JUL_FINER },
95 { .name = "JUL_FINER", .value = LTTNG_LOGLEVEL_JUL_FINER },
96 { .name = "FINEST", .value = LTTNG_LOGLEVEL_JUL_FINEST },
97 { .name = "JUL_FINEST", .value = LTTNG_LOGLEVEL_JUL_FINEST },
98 { .name = "ALL", .value = LTTNG_LOGLEVEL_JUL_ALL },
99 { .name = "JUL_ALL", .value = LTTNG_LOGLEVEL_JUL_ALL },
100 };
101
102 static
103 const struct loglevel_name_value loglevel_python_values[] = {
104 { .name = "CRITICAL", .value = LTTNG_LOGLEVEL_PYTHON_CRITICAL },
105 { .name = "PYTHON_CRITICAL", .value = LTTNG_LOGLEVEL_PYTHON_CRITICAL },
106 { .name = "ERROR", .value = LTTNG_LOGLEVEL_PYTHON_ERROR },
107 { .name = "PYTHON_ERROR", .value = LTTNG_LOGLEVEL_PYTHON_ERROR },
108 { .name = "WARNING", .value = LTTNG_LOGLEVEL_PYTHON_WARNING },
109 { .name = "PYTHON_WARNING", .value = LTTNG_LOGLEVEL_PYTHON_WARNING },
110 { .name = "INFO", .value = LTTNG_LOGLEVEL_PYTHON_INFO },
111 { .name = "PYTHON_INFO", .value = LTTNG_LOGLEVEL_PYTHON_INFO },
112 { .name = "DEBUG", .value = LTTNG_LOGLEVEL_PYTHON_DEBUG },
113 { .name = "PYTNON_DEBUG", .value = LTTNG_LOGLEVEL_PYTHON_DEBUG },
114 { .name = "NOTSET", .value = LTTNG_LOGLEVEL_PYTHON_NOTSET },
115 { .name = "PYTHON_NOTSET", .value = LTTNG_LOGLEVEL_PYTHON_NOTSET },
116 };
117
118 static
119 bool string_equal_insensitive(const char *a, const char *b)
120 {
121 return strcasecmp(a, b) == 0;
122 }
123
124 static
125 int lookup_value_from_name(const struct loglevel_name_value values[],
126 size_t values_count, const char *name)
127 {
128 size_t i;
129 int ret = -1;
130
131 if (!name) {
132 goto end;
133 }
134
135 for (i = 0; i < values_count; i++) {
136 if (string_equal_insensitive(values[i].name, name)) {
137 /* Match found. */
138 ret = values[i].value;
139 goto end;
140 }
141 }
142
143 end:
144 return ret;
145 }
146
147 LTTNG_HIDDEN
148 int loglevel_name_to_value(const char *name, enum lttng_loglevel *loglevel)
149 {
150 int ret = lookup_value_from_name(loglevel_values,
151 ARRAY_SIZE(loglevel_values), name);
152
153 if (ret >= 0) {
154 *loglevel = (typeof(*loglevel)) ret;
155 ret = 0;
156 }
157
158 return ret;
159 }
160
161 LTTNG_HIDDEN
162 int loglevel_log4j_name_to_value(
163 const char *name, enum lttng_loglevel_log4j *loglevel)
164 {
165 int ret = lookup_value_from_name(loglevel_log4j_values,
166 ARRAY_SIZE(loglevel_log4j_values),
167 name);
168
169 if (ret >= 0) {
170 *loglevel = (typeof(*loglevel)) ret;
171 ret = 0;
172 }
173
174 return ret;
175 }
176
177 LTTNG_HIDDEN
178 int loglevel_jul_name_to_value(
179 const char *name, enum lttng_loglevel_jul *loglevel)
180 {
181 int ret = lookup_value_from_name(loglevel_jul_values,
182 ARRAY_SIZE(loglevel_jul_values),
183 name);
184
185 if (ret >= 0) {
186 *loglevel = (typeof(*loglevel)) ret;
187 ret = 0;
188 }
189
190 return ret;
191 }
192
193 LTTNG_HIDDEN
194 int loglevel_python_name_to_value(
195 const char *name, enum lttng_loglevel_python *loglevel)
196 {
197 int ret = lookup_value_from_name(loglevel_python_values,
198 ARRAY_SIZE(loglevel_python_values),
199 name);
200
201 if (ret >= 0) {
202 *loglevel = (typeof(*loglevel)) ret;
203 ret = 0;
204 }
205
206 return ret;
207 }
208
209 static
210 const char *lookup_name_from_value(const struct loglevel_name_value values[],
211 size_t values_count, int loglevel)
212 {
213 size_t i;
214 const char *name = NULL;
215
216 for (i = 0; i < values_count; i++) {
217 if (values[i].value == loglevel) {
218 /* Match found. */
219 name = values[i].name;
220 goto end;
221 }
222 }
223
224 end:
225 return name;
226 }
227
228 LTTNG_HIDDEN
229 const char *loglevel_value_to_name(int loglevel)
230 {
231 return lookup_name_from_value(
232 loglevel_values, ARRAY_SIZE(loglevel_values), loglevel);
233 }
234
235 LTTNG_HIDDEN
236 const char *loglevel_log4j_value_to_name(int loglevel)
237 {
238 return lookup_name_from_value(loglevel_log4j_values,
239 ARRAY_SIZE(loglevel_log4j_values), loglevel);
240 }
241
242 LTTNG_HIDDEN
243 const char *loglevel_jul_value_to_name(int loglevel)
244 {
245 return lookup_name_from_value(loglevel_jul_values,
246 ARRAY_SIZE(loglevel_jul_values), loglevel);
247 }
248
249 LTTNG_HIDDEN
250 const char *loglevel_python_value_to_name(int loglevel)
251 {
252 return lookup_name_from_value(loglevel_python_values,
253 ARRAY_SIZE(loglevel_python_values), loglevel);
254 }
This page took 0.037646 seconds and 5 git commands to generate.