2 * Copyright (C) 2020 Jonathan Rajotte <jonathan.rajotte-julien@efficios.com>
4 * SPDX-License-Identifier: LGPL-2.1-only
9 #include <common/dynamic-buffer.h>
10 #include <common/error.h>
11 #include <common/macros.h>
12 #include <common/hashtable/hashtable.h>
13 #include <common/hashtable/utils.h>
14 #include <lttng/log-level-rule-internal.h>
15 #include <lttng/log-level-rule.h>
19 static bool is_log_level_rule_exactly_type(const struct lttng_log_level_rule
*rule
)
21 enum lttng_log_level_rule_type type
=
22 lttng_log_level_rule_get_type(rule
);
24 return type
== LTTNG_LOG_LEVEL_RULE_TYPE_EXACTLY
;
27 static bool is_log_level_rule_at_least_as_severe_type(const struct lttng_log_level_rule
*rule
)
30 enum lttng_log_level_rule_type type
=
31 lttng_log_level_rule_get_type(rule
);
33 return type
== LTTNG_LOG_LEVEL_RULE_TYPE_AT_LEAST_AS_SEVERE_AS
;
36 enum lttng_log_level_rule_type
lttng_log_level_rule_get_type(
37 const struct lttng_log_level_rule
*rule
)
39 return rule
? rule
->type
: LTTNG_LOG_LEVEL_RULE_TYPE_UNKNOWN
;
42 struct lttng_log_level_rule
*lttng_log_level_rule_exactly_create(
45 struct lttng_log_level_rule
*rule
= NULL
;
47 rule
= zmalloc(sizeof(struct lttng_log_level_rule
));
52 rule
->type
= LTTNG_LOG_LEVEL_RULE_TYPE_EXACTLY
;
59 enum lttng_log_level_rule_status
lttng_log_level_rule_exactly_get_level(
60 const struct lttng_log_level_rule
*rule
, int *level
)
62 enum lttng_log_level_rule_status status
= LTTNG_LOG_LEVEL_RULE_STATUS_OK
;
63 if (!rule
|| !level
|| !is_log_level_rule_exactly_type(rule
)) {
64 status
= LTTNG_LOG_LEVEL_RULE_STATUS_INVALID
;
73 struct lttng_log_level_rule
*
74 lttng_log_level_rule_at_least_as_severe_as_create(int level
)
76 struct lttng_log_level_rule
*rule
= NULL
;
78 rule
= zmalloc(sizeof(struct lttng_log_level_rule
));
83 rule
->type
= LTTNG_LOG_LEVEL_RULE_TYPE_AT_LEAST_AS_SEVERE_AS
;
90 enum lttng_log_level_rule_status
91 lttng_log_level_rule_at_least_as_severe_as_get_level(
92 const struct lttng_log_level_rule
*rule
, int *level
)
94 enum lttng_log_level_rule_status status
= LTTNG_LOG_LEVEL_RULE_STATUS_OK
;
95 if (!rule
|| !level
|| !is_log_level_rule_at_least_as_severe_type(rule
)) {
96 status
= LTTNG_LOG_LEVEL_RULE_STATUS_INVALID
;
100 *level
= rule
->level
;
105 void lttng_log_level_rule_destroy(struct lttng_log_level_rule
*log_level_rule
)
107 free(log_level_rule
);
111 ssize_t
lttng_log_level_rule_create_from_payload(
112 struct lttng_payload_view
*view
,
113 struct lttng_log_level_rule
**_rule
)
117 struct lttng_log_level_rule
*rule
= NULL
;
118 const struct lttng_log_level_rule_comm
*comm
=
119 (const struct lttng_log_level_rule_comm
*)
122 offset
+= sizeof(*comm
);
129 if (view
->buffer
.size
< sizeof(*comm
)) {
134 switch (comm
->type
) {
135 case LTTNG_LOG_LEVEL_RULE_TYPE_EXACTLY
:
136 rule
= lttng_log_level_rule_exactly_create((int) comm
->level
);
138 case LTTNG_LOG_LEVEL_RULE_TYPE_AT_LEAST_AS_SEVERE_AS
:
139 rule
= lttng_log_level_rule_at_least_as_severe_as_create(
159 int lttng_log_level_rule_serialize(const struct lttng_log_level_rule
*rule
,
160 struct lttng_payload
*payload
)
163 struct lttng_log_level_rule_comm comm
;
171 comm
.type
= (int8_t) rule
->type
;
172 comm
.level
= (int32_t) rule
->level
;
174 DBG("Serializing log level rule of type %d", rule
->type
);
175 ret
= lttng_dynamic_buffer_append(&payload
->buffer
, &comm
,
186 bool lttng_log_level_rule_is_equal(const struct lttng_log_level_rule
*a
,
187 const struct lttng_log_level_rule
*b
)
189 bool is_equal
= false;
191 if (a
== NULL
&& b
== NULL
) {
197 if (a
== NULL
|| b
== NULL
) {
208 if (a
->type
!= b
->type
) {
212 if (a
->level
!= b
->level
) {
223 struct lttng_log_level_rule
* lttng_log_level_rule_copy(const struct lttng_log_level_rule
*source
)
225 struct lttng_log_level_rule
*copy
= NULL
;
229 copy
= zmalloc(sizeof(struct lttng_log_level_rule
));
234 copy
->type
= source
->type
;
235 copy
->level
= source
->level
;
241 void lttng_log_level_rule_to_loglevel(
242 const struct lttng_log_level_rule
*log_level_rule
,
243 enum lttng_loglevel_type
*loglevel_type
,
246 assert(log_level_rule
);
248 switch(log_level_rule
->type
)
250 case LTTNG_LOG_LEVEL_RULE_TYPE_EXACTLY
:
251 *loglevel_type
= LTTNG_EVENT_LOGLEVEL_SINGLE
;
253 case LTTNG_LOG_LEVEL_RULE_TYPE_AT_LEAST_AS_SEVERE_AS
:
254 *loglevel_type
= LTTNG_EVENT_LOGLEVEL_RANGE
;
260 *loglevel_value
= log_level_rule
->level
;
264 unsigned long lttng_log_level_rule_hash(
265 const struct lttng_log_level_rule
*log_level_rule
)
268 enum lttng_log_level_rule_status llr_status
;
270 enum lttng_log_level_rule_type type
;
272 assert(log_level_rule
);
274 type
= lttng_log_level_rule_get_type(log_level_rule
);
277 case LTTNG_LOG_LEVEL_RULE_TYPE_EXACTLY
:
278 llr_status
= lttng_log_level_rule_exactly_get_level(
279 log_level_rule
, &log_level_value
);
281 case LTTNG_LOG_LEVEL_RULE_TYPE_AT_LEAST_AS_SEVERE_AS
:
282 llr_status
= lttng_log_level_rule_at_least_as_severe_as_get_level(
283 log_level_rule
, &log_level_value
);
290 assert(llr_status
== LTTNG_LOG_LEVEL_RULE_STATUS_OK
);
292 hash
= hash_key_ulong((void *) (unsigned long) type
, lttng_ht_seed
);
294 hash
^= hash_key_ulong((void *) (unsigned long) log_level_value
,