lib: compile liblttng-ctl as C++
[lttng-tools.git] / src / common / mi-lttng.c
1 /*
2 * Copyright (C) 2014 Jonathan Rajotte <jonathan.r.julien@gmail.com>
3 * Copyright (C) 2014 Olivier Cotte <olivier.cotte@polymtl.ca>
4 * Copyright (C) 2016 Jérémie Galarneau <jeremie.galarneau@efficios.com>
5 *
6 * SPDX-License-Identifier: GPL-2.0-only
7 *
8 */
9
10 #include "lttng/tracker.h"
11 #define _LGPL_SOURCE
12 #include "mi-lttng.h"
13 #include <common/config/session-config.h>
14 #include <common/defaults.h>
15 #include <common/tracker.h>
16 #include <lttng/channel.h>
17 #include <lttng/snapshot-internal.h>
18
19
20 #define MI_SCHEMA_MAJOR_VERSION 4
21 #define MI_SCHEMA_MINOR_VERSION 1
22
23 /* Machine interface namespace URI */
24 const char * const mi_lttng_xmlns = "xmlns";
25 const char * const mi_lttng_xmlns_xsi = "xmlns:xsi";
26 const char * const mi_lttng_w3_schema_uri = "http://www.w3.org/2001/XMLSchema-instance";
27 const char * const mi_lttng_schema_location = "xsi:schemaLocation";
28 const char * const mi_lttng_schema_location_uri =
29 DEFAULT_LTTNG_MI_NAMESPACE " "
30 "https://lttng.org/xml/schemas/lttng-mi/" XSTR(MI_SCHEMA_MAJOR_VERSION)
31 "/lttng-mi-" XSTR(MI_SCHEMA_MAJOR_VERSION) "."
32 XSTR(MI_SCHEMA_MINOR_VERSION) ".xsd";
33 const char * const mi_lttng_schema_version = "schemaVersion";
34 const char * const mi_lttng_schema_version_value = XSTR(MI_SCHEMA_MAJOR_VERSION)
35 "." XSTR(MI_SCHEMA_MINOR_VERSION);
36
37 /* Strings related to command */
38 const char * const mi_lttng_element_command = "command";
39 const char * const mi_lttng_element_command_action = "snapshot_action";
40 const char * const mi_lttng_element_command_add_context = "add-context";
41 const char *const mi_lttng_element_command_add_trigger = "add-trigger";
42 const char * const mi_lttng_element_command_create = "create";
43 const char * const mi_lttng_element_command_destroy = "destroy";
44 const char * const mi_lttng_element_command_disable_channel = "disable-channel";
45 const char * const mi_lttng_element_command_disable_event = "disable-event";
46 const char * const mi_lttng_element_command_enable_channels = "enable-channel";
47 const char * const mi_lttng_element_command_enable_event = "enable-event";
48 const char * const mi_lttng_element_command_list = "list";
49 const char *const mi_lttng_element_command_list_trigger = "list-trigger";
50 const char * const mi_lttng_element_command_load = "load";
51 const char * const mi_lttng_element_command_metadata = "metadata";
52 const char * const mi_lttng_element_command_metadata_action = "metadata_action";
53 const char * const mi_lttng_element_command_regenerate = "regenerate";
54 const char * const mi_lttng_element_command_regenerate_action = "regenerate_action";
55 const char * const mi_lttng_element_command_name = "name";
56 const char * const mi_lttng_element_command_output = "output";
57 const char *const mi_lttng_element_command_remove_trigger = "remove-trigger";
58 const char * const mi_lttng_element_command_save = "save";
59 const char * const mi_lttng_element_command_set_session = "set-session";
60 const char * const mi_lttng_element_command_snapshot = "snapshot";
61 const char * const mi_lttng_element_command_snapshot_add = "add_snapshot";
62 const char * const mi_lttng_element_command_snapshot_del = "del_snapshot";
63 const char * const mi_lttng_element_command_snapshot_list = "list_snapshot";
64 const char * const mi_lttng_element_command_snapshot_record = "record_snapshot";
65 const char * const mi_lttng_element_command_start = "start";
66 const char * const mi_lttng_element_command_stop = "stop";
67 const char * const mi_lttng_element_command_success = "success";
68 const char * const mi_lttng_element_command_track = "track";
69 const char * const mi_lttng_element_command_untrack = "untrack";
70 const char * const mi_lttng_element_command_version = "version";
71 const char * const mi_lttng_element_command_rotate = "rotate";
72 const char * const mi_lttng_element_command_enable_rotation = "enable-rotation";
73 const char * const mi_lttng_element_command_disable_rotation = "disable-rotation";
74 const char * const mi_lttng_element_command_clear = "clear";
75
76 /* Strings related to version command */
77 const char * const mi_lttng_element_version = "version";
78 const char * const mi_lttng_element_version_commit = "commit";
79 const char * const mi_lttng_element_version_description = "description";
80 const char * const mi_lttng_element_version_license = "license";
81 const char * const mi_lttng_element_version_major = "major";
82 const char * const mi_lttng_element_version_minor = "minor";
83 const char * const mi_lttng_element_version_patch_level = "patchLevel";
84 const char * const mi_lttng_element_version_str = "string";
85 const char * const mi_lttng_element_version_web = "url";
86
87 /* String related to a lttng_event_field */
88 const char * const mi_lttng_element_event_field = "event_field";
89 const char * const mi_lttng_element_event_fields = "event_fields";
90
91 /* String related to lttng_event_perf_counter_ctx */
92 const char * const mi_lttng_element_perf_counter_context = "perf";
93
94 /* Strings related to pid */
95 const char * const mi_lttng_element_pid_id = "id";
96
97 /* Strings related to save command */
98 const char * const mi_lttng_element_save = "save";
99
100 /* Strings related to load command */
101 const char * const mi_lttng_element_load = "load";
102 const char * const mi_lttng_element_load_overrides = "overrides";
103 const char * const mi_lttng_element_load_override_url = "url";
104
105 /* General elements of mi_lttng */
106 const char * const mi_lttng_element_empty = "";
107 const char * const mi_lttng_element_id = "id";
108 const char * const mi_lttng_element_nowrite = "nowrite";
109 const char * const mi_lttng_element_success = "success";
110 const char * const mi_lttng_element_type_enum = "ENUM";
111 const char * const mi_lttng_element_type_float = "FLOAT";
112 const char * const mi_lttng_element_type_integer = "INTEGER";
113 const char * const mi_lttng_element_type_other = "OTHER";
114 const char * const mi_lttng_element_type_string = "STRING";
115
116 /* String related to loglevel */
117 const char * const mi_lttng_loglevel_str_alert = "TRACE_ALERT";
118 const char * const mi_lttng_loglevel_str_crit = "TRACE_CRIT";
119 const char * const mi_lttng_loglevel_str_debug = "TRACE_DEBUG";
120 const char * const mi_lttng_loglevel_str_debug_function = "TRACE_DEBUG_FUNCTION";
121 const char * const mi_lttng_loglevel_str_debug_line = "TRACE_DEBUG_LINE";
122 const char * const mi_lttng_loglevel_str_debug_module = "TRACE_DEBUG_MODULE";
123 const char * const mi_lttng_loglevel_str_debug_process = "TRACE_DEBUG_PROCESS";
124 const char * const mi_lttng_loglevel_str_debug_program = "TRACE_DEBUG_PROGRAM";
125 const char * const mi_lttng_loglevel_str_debug_system = "TRACE_DEBUG_SYSTEM";
126 const char * const mi_lttng_loglevel_str_debug_unit = "TRACE_DEBUG_UNIT";
127 const char * const mi_lttng_loglevel_str_emerg = "TRACE_EMERG";
128 const char * const mi_lttng_loglevel_str_err = "TRACE_ERR";
129 const char * const mi_lttng_loglevel_str_info = "TRACE_INFO";
130 const char * const mi_lttng_loglevel_str_notice = "TRACE_NOTICE";
131 const char * const mi_lttng_loglevel_str_unknown = "UNKNOWN";
132 const char * const mi_lttng_loglevel_str_warning = "TRACE_WARNING";
133
134 /* String related to loglevel JUL */
135 const char * const mi_lttng_loglevel_str_jul_all = "JUL_ALL";
136 const char * const mi_lttng_loglevel_str_jul_config = "JUL_CONFIG";
137 const char * const mi_lttng_loglevel_str_jul_fine = "JUL_FINE";
138 const char * const mi_lttng_loglevel_str_jul_finer = "JUL_FINER";
139 const char * const mi_lttng_loglevel_str_jul_finest = "JUL_FINEST";
140 const char * const mi_lttng_loglevel_str_jul_info = "JUL_INFO";
141 const char * const mi_lttng_loglevel_str_jul_off = "JUL_OFF";
142 const char * const mi_lttng_loglevel_str_jul_severe = "JUL_SEVERE";
143 const char * const mi_lttng_loglevel_str_jul_warning = "JUL_WARNING";
144
145 /* String related to loglevel LOG4J */
146 const char * const mi_lttng_loglevel_str_log4j_off = "LOG4J_OFF";
147 const char * const mi_lttng_loglevel_str_log4j_fatal = "LOG4J_FATAL";
148 const char * const mi_lttng_loglevel_str_log4j_error = "LOG4J_ERROR";
149 const char * const mi_lttng_loglevel_str_log4j_warn = "LOG4J_WARN";
150 const char * const mi_lttng_loglevel_str_log4j_info = "LOG4J_INFO";
151 const char * const mi_lttng_loglevel_str_log4j_debug = "LOG4J_DEBUG";
152 const char * const mi_lttng_loglevel_str_log4j_trace = "LOG4J_TRACE";
153 const char * const mi_lttng_loglevel_str_log4j_all = "LOG4J_ALL";
154
155 /* String related to loglevel Python */
156 const char * const mi_lttng_loglevel_str_python_critical = "PYTHON_CRITICAL";
157 const char * const mi_lttng_loglevel_str_python_error = "PYTHON_ERROR";
158 const char * const mi_lttng_loglevel_str_python_warning = "PYTHON_WARNING";
159 const char * const mi_lttng_loglevel_str_python_info = "PYTHON_INFO";
160 const char * const mi_lttng_loglevel_str_python_debug = "PYTHON_DEBUG";
161 const char * const mi_lttng_loglevel_str_python_notset = "PYTHON_NOTSET";
162
163 /* String related to loglevel type */
164 const char * const mi_lttng_loglevel_type_all = "ALL";
165 const char * const mi_lttng_loglevel_type_range = "RANGE";
166 const char * const mi_lttng_loglevel_type_single = "SINGLE";
167 const char * const mi_lttng_loglevel_type_unknown = "UNKNOWN";
168
169 /* String related to a lttng_snapshot_output */
170 const char * const mi_lttng_element_snapshot_ctrl_url = "ctrl_url";
171 const char * const mi_lttng_element_snapshot_data_url = "data_url";
172 const char * const mi_lttng_element_snapshot_max_size = "max_size";
173 const char * const mi_lttng_element_snapshot_n_ptr = "n_ptr";
174 const char * const mi_lttng_element_snapshot_session_name = "session_name";
175 const char * const mi_lttng_element_snapshots = "snapshots";
176
177 /* String related to track/untrack command */
178 const char * const mi_lttng_element_track_untrack_all_wildcard = "*";
179
180 const char * const mi_lttng_element_session_name = "session_name";
181
182 /* String related to rotate command */
183 const char * const mi_lttng_element_rotation = "rotation";
184 const char * const mi_lttng_element_rotate_status = "status";
185 const char * const mi_lttng_element_rotation_schedule = "rotation_schedule";
186 const char * const mi_lttng_element_rotation_schedules = "rotation_schedules";
187 const char * const mi_lttng_element_rotation_schedule_result = "rotation_schedule_result";
188 const char * const mi_lttng_element_rotation_schedule_results = "rotation_schedule_results";
189 const char * const mi_lttng_element_rotation_schedule_periodic = "periodic";
190 const char * const mi_lttng_element_rotation_schedule_periodic_time_us = "time_us";
191 const char * const mi_lttng_element_rotation_schedule_size_threshold = "size_threshold";
192 const char * const mi_lttng_element_rotation_schedule_size_threshold_bytes = "bytes";
193 const char * const mi_lttng_element_rotation_state = "state";
194 const char * const mi_lttng_element_rotation_location = "location";
195 const char * const mi_lttng_element_rotation_location_local = "local";
196 const char * const mi_lttng_element_rotation_location_local_absolute_path = "absolute_path";
197 const char * const mi_lttng_element_rotation_location_relay = "relay";
198 const char * const mi_lttng_element_rotation_location_relay_host = "host";
199 const char * const mi_lttng_element_rotation_location_relay_control_port = "control_port";
200 const char * const mi_lttng_element_rotation_location_relay_data_port = "data_port";
201 const char * const mi_lttng_element_rotation_location_relay_protocol = "protocol";
202 const char * const mi_lttng_element_rotation_location_relay_relative_path = "relative_path";
203
204 /* String related to enum lttng_rotation_state */
205 const char * const mi_lttng_rotation_state_str_ongoing = "ONGOING";
206 const char * const mi_lttng_rotation_state_str_completed = "COMPLETED";
207 const char * const mi_lttng_rotation_state_str_expired = "EXPIRED";
208 const char * const mi_lttng_rotation_state_str_error = "ERROR";
209
210 /* String related to enum lttng_trace_archive_location_relay_protocol_type */
211 const char * const mi_lttng_rotation_location_relay_protocol_str_tcp = "TCP";
212
213 /* String related to rate_policy elements */
214 const char *const mi_lttng_element_rate_policy = "rate_policy";
215 const char *const mi_lttng_element_rate_policy_every_n =
216 "rate_policy_every_n";
217 const char *const mi_lttng_element_rate_policy_once_after_n =
218 "rate_policy_once_after_n";
219
220 const char *const mi_lttng_element_rate_policy_every_n_interval =
221 "interval";
222 const char
223 *const mi_lttng_element_rate_policy_once_after_n_threshold =
224 "threshold";
225
226 /* String related to action elements */
227 const char *const mi_lttng_element_action = "action";
228 const char *const mi_lttng_element_action_list = "action_list";
229 const char *const mi_lttng_element_action_notify = "action_notify";
230 const char *const mi_lttng_element_action_start_session =
231 "action_start_session";
232 const char *const mi_lttng_element_action_stop_session =
233 "action_stop_session";
234 const char *const mi_lttng_element_action_rotate_session =
235 "action_rotate_session";
236 const char *const mi_lttng_element_action_snapshot_session =
237 "action_snapshot_session";
238 const char *const mi_lttng_element_action_snapshot_session_output =
239 "output";
240
241 /* String related to condition */
242 const char *const mi_lttng_element_condition = "condition";
243 const char *const mi_lttng_element_condition_buffer_usage_high =
244 "condition_buffer_usage_high";
245 const char *const mi_lttng_element_condition_buffer_usage_low =
246 "condition_buffer_usage_low";
247 const char *const mi_lttng_element_condition_event_rule_matches =
248 "condition_event_rule_matches";
249 const char *const mi_lttng_element_condition_session_consumed_size =
250 "condition_session_consumed_size";
251 const char *const mi_lttng_element_condition_session_rotation =
252 "condition_session_rotation";
253 const char
254 *const mi_lttng_element_condition_session_rotation_completed =
255 "condition_session_rotation_completed";
256 const char
257 *const mi_lttng_element_condition_session_rotation_ongoing =
258 "condition_session_rotation_ongoing";
259
260 const char *const mi_lttng_element_condition_channel_name =
261 "channel_name";
262 const char *const mi_lttng_element_condition_threshold_bytes =
263 "threshold_bytes";
264 const char *const mi_lttng_element_condition_threshold_ratio =
265 "threshold_ratio";
266
267 /* String related to capture descriptor */
268 const char *const mi_lttng_element_capture_descriptor =
269 "capture_descriptor";
270 const char *const mi_lttng_element_capture_descriptors =
271 "capture_descriptors";
272
273 /* String related to event expression */
274 const char *const mi_lttng_element_event_expr = "event_expr";
275 const char *const mi_lttng_element_event_expr_payload_field =
276 "event_expr_payload_field";
277 const char *const mi_lttng_element_event_expr_channel_context_field =
278 "event_expr_channel_context_field";
279 const char
280 *const mi_lttng_element_event_expr_app_specific_context_field =
281 "event_expr_app_specific_context_field";
282 const char *const mi_lttng_element_event_expr_array_field_element =
283 "event_expr_array_field_element";
284 const char *const mi_lttng_element_event_expr_provider_name =
285 "provider_name";
286 const char *const mi_lttng_element_event_expr_type_name =
287 "type_name";
288 const char *const mi_lttng_element_event_expr_index = "index";
289
290 /* String related to event rule */
291 const char *const mi_lttng_element_event_rule = "event_rule";
292
293 /* String related to lttng_event_rule_type */
294 const char *const mi_lttng_element_event_rule_event_name =
295 "event_name";
296 const char *const mi_lttng_element_event_rule_name_pattern =
297 "name_pattern";
298 const char *const mi_lttng_element_event_rule_filter_expression =
299 "filter_expression";
300
301 const char *const mi_lttng_element_event_rule_jul_logging =
302 "event_rule_jul_logging";
303 const char *const mi_lttng_element_event_rule_kernel_kprobe =
304 "event_rule_kernel_kprobe";
305 const char *const mi_lttng_element_event_rule_kernel_syscall =
306 "event_rule_kernel_syscall";
307 const char *const mi_lttng_element_event_rule_kernel_tracepoint =
308 "event_rule_kernel_tracepoint";
309 const char *const mi_lttng_element_event_rule_kernel_uprobe =
310 "event_rule_kernel_uprobe";
311 const char *const mi_lttng_element_event_rule_log4j_logging =
312 "event_rule_log4j_logging";
313 const char *const mi_lttng_element_event_rule_python_logging =
314 "event_rule_python_logging";
315 const char *const mi_lttng_element_event_rule_user_tracepoint =
316 "event_rule_user_tracepoint";
317
318 /* String related to lttng_event_rule_kernel_syscall. */
319 const char *const
320 mi_lttng_element_event_rule_kernel_syscall_emission_site =
321 "emission_site";
322
323 /* String related to enum lttng_event_rule_kernel_syscall_emission_site. */
324 const char *const
325 mi_lttng_event_rule_kernel_syscall_emission_site_entry_exit =
326 "entry+exit";
327 const char
328 *const mi_lttng_event_rule_kernel_syscall_emission_site_entry =
329 "entry";
330 const char *const
331 mi_lttng_event_rule_kernel_syscall_emission_site_exit = "exit";
332
333 /* String related to lttng_event_rule_user_tracepoint */
334 const char *const
335 mi_lttng_element_event_rule_user_tracepoint_name_pattern_exclusions =
336 "name_pattern_exclusions";
337 const char *const
338 mi_lttng_element_event_rule_user_tracepoint_name_pattern_exclusion =
339 "name_pattern_exclusion";
340
341 /* String related to log level rule. */
342 const char *const mi_lttng_element_log_level_rule =
343 "log_level_rule";
344 const char *const mi_lttng_element_log_level_rule_exactly =
345 "log_level_rule_exactly";
346 const char
347 *const mi_lttng_element_log_level_rule_at_least_as_severe_as =
348 "log_level_rule_at_least_as_severe_as";
349 const char *const mi_lttng_element_log_level_rule_level = "level";
350
351 /* String related to kernel probe location. */
352 const char *const mi_lttng_element_kernel_probe_location =
353 "kernel_probe_location";
354 const char
355 *const mi_lttng_element_kernel_probe_location_symbol_offset =
356 "kernel_probe_location_symbol_offset";
357 const char *const
358 mi_lttng_element_kernel_probe_location_symbol_offset_name =
359 "name";
360 const char *const
361 mi_lttng_element_kernel_probe_location_symbol_offset_offset =
362 "offset";
363
364 const char *const mi_lttng_element_kernel_probe_location_address =
365 "kernel_probe_location_address";
366 const char
367 *const mi_lttng_element_kernel_probe_location_address_address =
368 "address";
369
370 /* String related to userspace probe location. */
371 const char *const mi_lttng_element_userspace_probe_location =
372 "userspace_probe_location";
373 const char
374 *const mi_lttng_element_userspace_probe_location_binary_path =
375 "binary_path";
376 const char
377 *const mi_lttng_element_userspace_probe_location_function =
378 "userspace_probe_location_function";
379 const char
380 *const mi_lttng_element_userspace_probe_location_function_name =
381 "name";
382 const char
383 *const mi_lttng_element_userspace_probe_location_lookup_method =
384 "userspace_probe_location_lookup_method";
385 const char *const
386 mi_lttng_element_userspace_probe_location_lookup_method_function_default =
387 "userspace_probe_location_lookup_method_function_default";
388 const char *const
389 mi_lttng_element_userspace_probe_location_lookup_method_function_elf =
390 "userspace_probe_location_lookup_method_function_elf";
391 const char *const
392 mi_lttng_element_userspace_probe_location_lookup_method_tracepoint_sdt =
393 "userspace_probe_location_lookup_method_tracepoint_sdt";
394 const char
395 *const mi_lttng_element_userspace_probe_location_tracepoint =
396 "userspace_probe_location_tracepoint";
397 const char *const
398 mi_lttng_element_userspace_probe_location_tracepoint_probe_name =
399 "probe_name";
400 const char *const
401 mi_lttng_element_userspace_probe_location_tracepoint_provider_name =
402 "provider_name";
403
404 /* String related to enum
405 * lttng_userspace_probe_location_function_instrumentation_type */
406 const char *const
407 mi_lttng_element_userspace_probe_location_function_instrumentation_type =
408 "instrumentation_type";
409 const char *const
410 mi_lttng_userspace_probe_location_function_instrumentation_type_entry =
411 "ENTRY";
412
413 /* String related to trigger */
414 const char *const mi_lttng_element_triggers = "triggers";
415 const char *const mi_lttng_element_trigger = "trigger";
416 const char *const mi_lttng_element_trigger_owner_uid = "owner_uid";
417
418 /* String related to error_query. */
419 const char *const mi_lttng_element_error_query_result =
420 "error_query_result";
421 const char *const mi_lttng_element_error_query_result_counter =
422 "error_query_result_counter";
423 const char *const
424 mi_lttng_element_error_query_result_counter_value = "value";
425 const char *const mi_lttng_element_error_query_result_description =
426 "description";
427 const char *const mi_lttng_element_error_query_result_name =
428 "name";
429 const char *const mi_lttng_element_error_query_result_type =
430 "type";
431 const char *const mi_lttng_element_error_query_results =
432 "error_query_results";
433
434 /* String related to add-context command */
435 const char * const mi_lttng_element_context_symbol = "symbol";
436
437 /* Deprecated symbols preserved for ABI compatibility. */
438 LTTNG_EXPORT const char * const mi_lttng_context_type_perf_counter;
439 LTTNG_EXPORT const char * const mi_lttng_context_type_perf_cpu_counter;
440 LTTNG_EXPORT const char * const mi_lttng_context_type_perf_thread_counter;
441 LTTNG_EXPORT const char * const mi_lttng_element_track_untrack_pid_target;
442 LTTNG_EXPORT const char * const mi_lttng_element_track_untrack_targets;
443 LTTNG_EXPORT const char * const mi_lttng_element_calibrate;
444 LTTNG_EXPORT const char * const mi_lttng_element_calibrate_function;
445 LTTNG_EXPORT const char * const mi_lttng_element_command_calibrate;
446
447 /* This is a merge of jul loglevel and regular loglevel
448 * Those should never overlap by definition
449 * (see struct lttng_event loglevel)
450 */
451 const char *mi_lttng_loglevel_string(int value, enum lttng_domain_type domain)
452 {
453 switch (domain) {
454 case LTTNG_DOMAIN_KERNEL:
455 case LTTNG_DOMAIN_UST:
456 switch (value) {
457 case -1:
458 return mi_lttng_element_empty;
459 case LTTNG_LOGLEVEL_EMERG:
460 return mi_lttng_loglevel_str_emerg;
461 case LTTNG_LOGLEVEL_ALERT:
462 return mi_lttng_loglevel_str_alert;
463 case LTTNG_LOGLEVEL_CRIT:
464 return mi_lttng_loglevel_str_crit;
465 case LTTNG_LOGLEVEL_ERR:
466 return mi_lttng_loglevel_str_err;
467 case LTTNG_LOGLEVEL_WARNING:
468 return mi_lttng_loglevel_str_warning;
469 case LTTNG_LOGLEVEL_NOTICE:
470 return mi_lttng_loglevel_str_notice;
471 case LTTNG_LOGLEVEL_INFO:
472 return mi_lttng_loglevel_str_info;
473 case LTTNG_LOGLEVEL_DEBUG_SYSTEM:
474 return mi_lttng_loglevel_str_debug_system;
475 case LTTNG_LOGLEVEL_DEBUG_PROGRAM:
476 return mi_lttng_loglevel_str_debug_program;
477 case LTTNG_LOGLEVEL_DEBUG_PROCESS:
478 return mi_lttng_loglevel_str_debug_process;
479 case LTTNG_LOGLEVEL_DEBUG_MODULE:
480 return mi_lttng_loglevel_str_debug_module;
481 case LTTNG_LOGLEVEL_DEBUG_UNIT:
482 return mi_lttng_loglevel_str_debug_unit;
483 case LTTNG_LOGLEVEL_DEBUG_FUNCTION:
484 return mi_lttng_loglevel_str_debug_function;
485 case LTTNG_LOGLEVEL_DEBUG_LINE:
486 return mi_lttng_loglevel_str_debug_line;
487 case LTTNG_LOGLEVEL_DEBUG:
488 return mi_lttng_loglevel_str_debug;
489 default:
490 return mi_lttng_loglevel_str_unknown;
491 }
492 break;
493 case LTTNG_DOMAIN_LOG4J:
494 switch (value) {
495 case -1:
496 return mi_lttng_element_empty;
497 case LTTNG_LOGLEVEL_LOG4J_OFF:
498 return mi_lttng_loglevel_str_log4j_off;
499 case LTTNG_LOGLEVEL_LOG4J_FATAL:
500 return mi_lttng_loglevel_str_log4j_fatal;
501 case LTTNG_LOGLEVEL_LOG4J_ERROR:
502 return mi_lttng_loglevel_str_log4j_error;
503 case LTTNG_LOGLEVEL_LOG4J_WARN:
504 return mi_lttng_loglevel_str_log4j_warn;
505 case LTTNG_LOGLEVEL_LOG4J_INFO:
506 return mi_lttng_loglevel_str_log4j_info;
507 case LTTNG_LOGLEVEL_LOG4J_DEBUG:
508 return mi_lttng_loglevel_str_log4j_debug;
509 case LTTNG_LOGLEVEL_LOG4J_TRACE:
510 return mi_lttng_loglevel_str_log4j_trace;
511 case LTTNG_LOGLEVEL_LOG4J_ALL:
512 return mi_lttng_loglevel_str_log4j_all;
513 default:
514 return mi_lttng_loglevel_str_unknown;
515 }
516 break;
517 case LTTNG_DOMAIN_JUL:
518 switch (value) {
519 case -1:
520 return mi_lttng_element_empty;
521 case LTTNG_LOGLEVEL_JUL_OFF:
522 return mi_lttng_loglevel_str_jul_off;
523 case LTTNG_LOGLEVEL_JUL_SEVERE:
524 return mi_lttng_loglevel_str_jul_severe;
525 case LTTNG_LOGLEVEL_JUL_WARNING:
526 return mi_lttng_loglevel_str_jul_warning;
527 case LTTNG_LOGLEVEL_JUL_INFO:
528 return mi_lttng_loglevel_str_jul_info;
529 case LTTNG_LOGLEVEL_JUL_CONFIG:
530 return mi_lttng_loglevel_str_jul_config;
531 case LTTNG_LOGLEVEL_JUL_FINE:
532 return mi_lttng_loglevel_str_jul_fine;
533 case LTTNG_LOGLEVEL_JUL_FINER:
534 return mi_lttng_loglevel_str_jul_finer;
535 case LTTNG_LOGLEVEL_JUL_FINEST:
536 return mi_lttng_loglevel_str_jul_finest;
537 case LTTNG_LOGLEVEL_JUL_ALL:
538 return mi_lttng_loglevel_str_jul_all;
539 default:
540 return mi_lttng_loglevel_str_unknown;
541 }
542 break;
543 case LTTNG_DOMAIN_PYTHON:
544 switch (value) {
545 case LTTNG_LOGLEVEL_PYTHON_CRITICAL:
546 return mi_lttng_loglevel_str_python_critical;
547 case LTTNG_LOGLEVEL_PYTHON_ERROR:
548 return mi_lttng_loglevel_str_python_error;
549 case LTTNG_LOGLEVEL_PYTHON_WARNING:
550 return mi_lttng_loglevel_str_python_warning;
551 case LTTNG_LOGLEVEL_PYTHON_INFO:
552 return mi_lttng_loglevel_str_python_info;
553 case LTTNG_LOGLEVEL_PYTHON_DEBUG:
554 return mi_lttng_loglevel_str_python_debug;
555 case LTTNG_LOGLEVEL_PYTHON_NOTSET:
556 return mi_lttng_loglevel_str_python_notset;
557 default:
558 return mi_lttng_loglevel_str_unknown;
559 }
560 break;
561 default:
562 return mi_lttng_loglevel_str_unknown;
563 }
564 }
565
566 const char *mi_lttng_logleveltype_string(enum lttng_loglevel_type value)
567 {
568 switch (value) {
569 case LTTNG_EVENT_LOGLEVEL_ALL:
570 return mi_lttng_loglevel_type_all;
571 case LTTNG_EVENT_LOGLEVEL_RANGE:
572 return mi_lttng_loglevel_type_range;
573 case LTTNG_EVENT_LOGLEVEL_SINGLE:
574 return mi_lttng_loglevel_type_single;
575 default:
576 return mi_lttng_loglevel_type_unknown;
577 }
578 }
579
580 static
581 const char *mi_lttng_eventtype_string(enum lttng_event_type value)
582 {
583 switch (value) {
584 case LTTNG_EVENT_ALL:
585 return config_event_type_all;
586 case LTTNG_EVENT_TRACEPOINT:
587 return config_event_type_tracepoint;
588 case LTTNG_EVENT_PROBE:
589 return config_event_type_probe;
590 case LTTNG_EVENT_USERSPACE_PROBE:
591 return config_event_type_userspace_probe;
592 case LTTNG_EVENT_FUNCTION:
593 return config_event_type_function;
594 case LTTNG_EVENT_FUNCTION_ENTRY:
595 return config_event_type_function_entry;
596 case LTTNG_EVENT_SYSCALL:
597 return config_event_type_syscall;
598 case LTTNG_EVENT_NOOP:
599 return config_event_type_noop;
600 default:
601 return mi_lttng_element_empty;
602 }
603 }
604
605 static
606 const char *mi_lttng_event_contexttype_string(enum lttng_event_context_type val)
607 {
608 switch (val) {
609 case LTTNG_EVENT_CONTEXT_PID:
610 return config_event_context_pid;
611 case LTTNG_EVENT_CONTEXT_PROCNAME:
612 return config_event_context_procname;
613 case LTTNG_EVENT_CONTEXT_PRIO:
614 return config_event_context_prio;
615 case LTTNG_EVENT_CONTEXT_NICE:
616 return config_event_context_nice;
617 case LTTNG_EVENT_CONTEXT_VPID:
618 return config_event_context_vpid;
619 case LTTNG_EVENT_CONTEXT_TID:
620 return config_event_context_tid;
621 case LTTNG_EVENT_CONTEXT_VTID:
622 return config_event_context_vtid;
623 case LTTNG_EVENT_CONTEXT_PPID:
624 return config_event_context_ppid;
625 case LTTNG_EVENT_CONTEXT_VPPID:
626 return config_event_context_vppid;
627 case LTTNG_EVENT_CONTEXT_PTHREAD_ID:
628 return config_event_context_pthread_id;
629 case LTTNG_EVENT_CONTEXT_HOSTNAME:
630 return config_event_context_hostname;
631 case LTTNG_EVENT_CONTEXT_IP:
632 return config_event_context_ip;
633 case LTTNG_EVENT_CONTEXT_INTERRUPTIBLE:
634 return config_event_context_interruptible;
635 case LTTNG_EVENT_CONTEXT_PREEMPTIBLE:
636 return config_event_context_preemptible;
637 case LTTNG_EVENT_CONTEXT_NEED_RESCHEDULE:
638 return config_event_context_need_reschedule;
639 case LTTNG_EVENT_CONTEXT_MIGRATABLE:
640 return config_event_context_migratable;
641 case LTTNG_EVENT_CONTEXT_CALLSTACK_USER:
642 return config_event_context_callstack_user;
643 case LTTNG_EVENT_CONTEXT_CALLSTACK_KERNEL:
644 return config_event_context_callstack_kernel;
645 case LTTNG_EVENT_CONTEXT_CGROUP_NS:
646 return config_event_context_cgroup_ns;
647 case LTTNG_EVENT_CONTEXT_IPC_NS:
648 return config_event_context_ipc_ns;
649 case LTTNG_EVENT_CONTEXT_MNT_NS:
650 return config_event_context_mnt_ns;
651 case LTTNG_EVENT_CONTEXT_NET_NS:
652 return config_event_context_net_ns;
653 case LTTNG_EVENT_CONTEXT_PID_NS:
654 return config_event_context_pid_ns;
655 case LTTNG_EVENT_CONTEXT_TIME_NS:
656 return config_event_context_time_ns;
657 case LTTNG_EVENT_CONTEXT_USER_NS:
658 return config_event_context_user_ns;
659 case LTTNG_EVENT_CONTEXT_UTS_NS:
660 return config_event_context_uts_ns;
661 case LTTNG_EVENT_CONTEXT_UID:
662 return config_event_context_uid;
663 case LTTNG_EVENT_CONTEXT_EUID:
664 return config_event_context_euid;
665 case LTTNG_EVENT_CONTEXT_SUID:
666 return config_event_context_suid;
667 case LTTNG_EVENT_CONTEXT_GID:
668 return config_event_context_gid;
669 case LTTNG_EVENT_CONTEXT_EGID:
670 return config_event_context_egid;
671 case LTTNG_EVENT_CONTEXT_SGID:
672 return config_event_context_sgid;
673 case LTTNG_EVENT_CONTEXT_VUID:
674 return config_event_context_vuid;
675 case LTTNG_EVENT_CONTEXT_VEUID:
676 return config_event_context_veuid;
677 case LTTNG_EVENT_CONTEXT_VSUID:
678 return config_event_context_vsuid;
679 case LTTNG_EVENT_CONTEXT_VGID:
680 return config_event_context_vgid;
681 case LTTNG_EVENT_CONTEXT_VEGID:
682 return config_event_context_vegid;
683 case LTTNG_EVENT_CONTEXT_VSGID:
684 return config_event_context_vsgid;
685 default:
686 return NULL;
687 }
688 }
689
690 const char *mi_lttng_eventfieldtype_string(enum lttng_event_field_type val)
691 {
692 switch (val) {
693 case(LTTNG_EVENT_FIELD_INTEGER):
694 return mi_lttng_element_type_integer;
695 case(LTTNG_EVENT_FIELD_ENUM):
696 return mi_lttng_element_type_enum;
697 case(LTTNG_EVENT_FIELD_FLOAT):
698 return mi_lttng_element_type_float;
699 case(LTTNG_EVENT_FIELD_STRING):
700 return mi_lttng_element_type_string;
701 default:
702 return mi_lttng_element_type_other;
703 }
704 }
705
706 const char *mi_lttng_domaintype_string(enum lttng_domain_type value)
707 {
708 switch (value) {
709 case LTTNG_DOMAIN_KERNEL:
710 return config_domain_type_kernel;
711 case LTTNG_DOMAIN_UST:
712 return config_domain_type_ust;
713 case LTTNG_DOMAIN_JUL:
714 return config_domain_type_jul;
715 case LTTNG_DOMAIN_LOG4J:
716 return config_domain_type_log4j;
717 case LTTNG_DOMAIN_PYTHON:
718 return config_domain_type_python;
719 default:
720 /* Should not have an unknown domain */
721 abort();
722 return NULL;
723 }
724 }
725
726 const char *mi_lttng_buffertype_string(enum lttng_buffer_type value)
727 {
728 switch (value) {
729 case LTTNG_BUFFER_PER_PID:
730 return config_buffer_type_per_pid;
731 case LTTNG_BUFFER_PER_UID:
732 return config_buffer_type_per_uid;
733 case LTTNG_BUFFER_GLOBAL:
734 return config_buffer_type_global;
735 default:
736 /* Should not have an unknow buffer type */
737 abort();
738 return NULL;
739 }
740 }
741
742 const char *mi_lttng_rotation_state_string(enum lttng_rotation_state value)
743 {
744 switch (value) {
745 case LTTNG_ROTATION_STATE_ONGOING:
746 return mi_lttng_rotation_state_str_ongoing;
747 case LTTNG_ROTATION_STATE_COMPLETED:
748 return mi_lttng_rotation_state_str_completed;
749 case LTTNG_ROTATION_STATE_EXPIRED:
750 return mi_lttng_rotation_state_str_expired;
751 case LTTNG_ROTATION_STATE_ERROR:
752 return mi_lttng_rotation_state_str_error;
753 default:
754 /* Should not have an unknow rotation state. */
755 abort();
756 return NULL;
757 }
758 }
759
760 const char *mi_lttng_trace_archive_location_relay_protocol_type_string(
761 enum lttng_trace_archive_location_relay_protocol_type value)
762 {
763 switch (value) {
764 case LTTNG_TRACE_ARCHIVE_LOCATION_RELAY_PROTOCOL_TYPE_TCP:
765 return mi_lttng_rotation_location_relay_protocol_str_tcp;
766 default:
767 /* Should not have an unknown relay protocol. */
768 abort();
769 return NULL;
770 }
771 }
772
773 struct mi_writer *mi_lttng_writer_create(int fd_output, int mi_output_type)
774 {
775 struct mi_writer *mi_writer;
776
777 mi_writer = zmalloc(sizeof(struct mi_writer));
778 if (!mi_writer) {
779 PERROR("zmalloc mi_writer_create");
780 goto end;
781 }
782 if (mi_output_type == LTTNG_MI_XML) {
783 mi_writer->writer = config_writer_create(fd_output, 0);
784 if (!mi_writer->writer) {
785 goto err_destroy;
786 }
787 mi_writer->type = LTTNG_MI_XML;
788 } else {
789 goto err_destroy;
790 }
791
792 end:
793 return mi_writer;
794
795 err_destroy:
796 free(mi_writer);
797 return NULL;
798 }
799
800 int mi_lttng_writer_destroy(struct mi_writer *writer)
801 {
802 int ret;
803
804 if (!writer) {
805 ret = -EINVAL;
806 goto end;
807 }
808
809 ret = config_writer_destroy(writer->writer);
810 if (ret < 0) {
811 goto end;
812 }
813
814 free(writer);
815 end:
816 return ret;
817 }
818
819 int mi_lttng_writer_command_open(struct mi_writer *writer, const char *command)
820 {
821 int ret;
822
823 /*
824 * A command is always the MI's root node, it must declare the current
825 * namespace and schema URIs and the schema's version.
826 */
827 ret = config_writer_open_element(writer->writer,
828 mi_lttng_element_command);
829 if (ret) {
830 goto end;
831 }
832
833 ret = config_writer_write_attribute(writer->writer,
834 mi_lttng_xmlns, DEFAULT_LTTNG_MI_NAMESPACE);
835 if (ret) {
836 goto end;
837 }
838
839 ret = config_writer_write_attribute(writer->writer,
840 mi_lttng_xmlns_xsi, mi_lttng_w3_schema_uri);
841 if (ret) {
842 goto end;
843 }
844
845 ret = config_writer_write_attribute(writer->writer,
846 mi_lttng_schema_location,
847 mi_lttng_schema_location_uri);
848 if (ret) {
849 goto end;
850 }
851
852 ret = config_writer_write_attribute(writer->writer,
853 mi_lttng_schema_version,
854 mi_lttng_schema_version_value);
855 if (ret) {
856 goto end;
857 }
858
859 ret = mi_lttng_writer_write_element_string(writer,
860 mi_lttng_element_command_name, command);
861 end:
862 return ret;
863 }
864
865 int mi_lttng_writer_command_close(struct mi_writer *writer)
866 {
867 return mi_lttng_writer_close_element(writer);
868 }
869
870 int mi_lttng_writer_open_element(struct mi_writer *writer,
871 const char *element_name)
872 {
873 return config_writer_open_element(writer->writer, element_name);
874 }
875
876 int mi_lttng_writer_close_element(struct mi_writer *writer)
877 {
878 return config_writer_close_element(writer->writer);
879 }
880
881 int mi_lttng_close_multi_element(struct mi_writer *writer,
882 unsigned int nb_element)
883 {
884 int ret, i;
885
886 if (nb_element < 1) {
887 ret = 0;
888 goto end;
889 }
890 for (i = 0; i < nb_element; i++) {
891 ret = mi_lttng_writer_close_element(writer);
892 if (ret) {
893 goto end;
894 }
895 }
896 end:
897 return ret;
898 }
899
900 int mi_lttng_writer_write_element_unsigned_int(struct mi_writer *writer,
901 const char *element_name, uint64_t value)
902 {
903 return config_writer_write_element_unsigned_int(writer->writer,
904 element_name, value);
905 }
906
907 int mi_lttng_writer_write_element_signed_int(struct mi_writer *writer,
908 const char *element_name, int64_t value)
909 {
910 return config_writer_write_element_signed_int(writer->writer,
911 element_name, value);
912 }
913
914 int mi_lttng_writer_write_element_bool(struct mi_writer *writer,
915 const char *element_name, int value)
916 {
917 return config_writer_write_element_bool(writer->writer,
918 element_name, value);
919 }
920
921 int mi_lttng_writer_write_element_string(struct mi_writer *writer,
922 const char *element_name, const char *value)
923 {
924 return config_writer_write_element_string(writer->writer,
925 element_name, value);
926 }
927
928 int mi_lttng_writer_write_element_double(struct mi_writer *writer,
929 const char *element_name,
930 double value)
931 {
932 return config_writer_write_element_double(
933 writer->writer, element_name, value);
934 }
935
936 int mi_lttng_version(struct mi_writer *writer, struct mi_lttng_version_data *version,
937 const char *lttng_description, const char *lttng_license)
938 {
939 int ret;
940
941 /* Open version */
942 ret = mi_lttng_writer_open_element(writer, mi_lttng_element_version);
943 if (ret) {
944 goto end;
945 }
946
947 /* Version string (contain info like rc etc.) */
948 ret = mi_lttng_writer_write_element_string(writer,
949 mi_lttng_element_version_str, version->version);
950 if (ret) {
951 goto end;
952 }
953
954 /* Major version number */
955 ret = mi_lttng_writer_write_element_unsigned_int(writer,
956 mi_lttng_element_version_major, version->version_major);
957 if (ret) {
958 goto end;
959 }
960
961 /* Minor version number */
962 ret = mi_lttng_writer_write_element_unsigned_int(writer,
963 mi_lttng_element_version_minor, version->version_minor);
964 if (ret) {
965 goto end;
966 }
967
968 /* Commit version number */
969 ret = mi_lttng_writer_write_element_string(writer,
970 mi_lttng_element_version_commit, version->version_commit);
971 if (ret) {
972 goto end;
973 }
974
975 /* Patch number */
976 ret = mi_lttng_writer_write_element_unsigned_int(writer,
977 mi_lttng_element_version_patch_level, version->version_patchlevel);
978 if (ret) {
979 goto end;
980 }
981
982 /* Name of the version */
983 ret = mi_lttng_writer_write_element_string(writer,
984 config_element_name, version->version_name);
985 if (ret) {
986 goto end;
987 }
988
989 /* Description mostly related to beer... */
990 ret = mi_lttng_writer_write_element_string(writer,
991 mi_lttng_element_version_description, lttng_description);
992 if (ret) {
993 goto end;
994 }
995
996 /* url */
997 ret = mi_lttng_writer_write_element_string(writer,
998 mi_lttng_element_version_web, version->package_url);
999 if (ret) {
1000 goto end;
1001 }
1002
1003 /* License: free as in free beer...no...*speech* */
1004 ret = mi_lttng_writer_write_element_string(writer,
1005 mi_lttng_element_version_license, lttng_license);
1006 if (ret) {
1007 goto end;
1008 }
1009
1010 /* Close version element */
1011 ret = mi_lttng_writer_close_element(writer);
1012
1013 end:
1014 return ret;
1015 }
1016
1017 int mi_lttng_sessions_open(struct mi_writer *writer)
1018 {
1019 return mi_lttng_writer_open_element(writer, config_element_sessions);
1020 }
1021
1022 int mi_lttng_session(struct mi_writer *writer,
1023 struct lttng_session *session, int is_open)
1024 {
1025 int ret;
1026
1027 LTTNG_ASSERT(session);
1028
1029 /* Open sessions element */
1030 ret = mi_lttng_writer_open_element(writer,
1031 config_element_session);
1032 if (ret) {
1033 goto end;
1034 }
1035
1036 /* Name of the session */
1037 ret = mi_lttng_writer_write_element_string(writer,
1038 config_element_name, session->name);
1039 if (ret) {
1040 goto end;
1041 }
1042
1043 /* Path */
1044 ret = mi_lttng_writer_write_element_string(writer,
1045 config_element_path, session->path);
1046 if (ret) {
1047 goto end;
1048 }
1049
1050 /* Enabled ? */
1051 ret = mi_lttng_writer_write_element_bool(writer,
1052 config_element_enabled, session->enabled);
1053 if (ret) {
1054 goto end;
1055 }
1056
1057 /* Snapshot mode */
1058 ret = mi_lttng_writer_write_element_unsigned_int(writer,
1059 config_element_snapshot_mode, session->snapshot_mode);
1060 if (ret) {
1061 goto end;
1062 }
1063
1064 /* Live timer interval in usec */
1065 ret = mi_lttng_writer_write_element_unsigned_int(writer,
1066 config_element_live_timer_interval,
1067 session->live_timer_interval);
1068 if (ret) {
1069 goto end;
1070 }
1071
1072 if (!is_open) {
1073 /* Closing session element */
1074 ret = mi_lttng_writer_close_element(writer);
1075 }
1076 end:
1077 return ret;
1078
1079 }
1080
1081 int mi_lttng_domains_open(struct mi_writer *writer)
1082 {
1083 return mi_lttng_writer_open_element(writer, config_element_domains);
1084 }
1085
1086 int mi_lttng_domain(struct mi_writer *writer,
1087 struct lttng_domain *domain, int is_open)
1088 {
1089 int ret = 0;
1090 const char *str_domain;
1091 const char *str_buffer;
1092
1093 LTTNG_ASSERT(domain);
1094
1095 /* Open domain element */
1096 ret = mi_lttng_writer_open_element(writer, config_element_domain);
1097 if (ret) {
1098 goto end;
1099 }
1100
1101 /* Domain Type */
1102 str_domain = mi_lttng_domaintype_string(domain->type);
1103 ret = mi_lttng_writer_write_element_string(writer, config_element_type,
1104 str_domain);
1105 if (ret) {
1106 goto end;
1107 }
1108
1109 /* Buffer Type */
1110 str_buffer= mi_lttng_buffertype_string(domain->buf_type);
1111 ret = mi_lttng_writer_write_element_string(writer,
1112 config_element_buffer_type, str_buffer);
1113 if (ret) {
1114 goto end;
1115 }
1116
1117 /* TODO: union attr
1118 * This union is not currently used and was added for
1119 * future ust domain support.
1120 * Date: 25-06-2014
1121 * */
1122
1123 if (!is_open) {
1124 /* Closing domain element */
1125 ret = mi_lttng_writer_close_element(writer);
1126 }
1127
1128 end:
1129 return ret;
1130
1131 }
1132
1133 int mi_lttng_channels_open(struct mi_writer *writer)
1134 {
1135 return mi_lttng_writer_open_element(writer, config_element_channels);
1136 }
1137
1138 int mi_lttng_channel(struct mi_writer *writer,
1139 struct lttng_channel *channel, int is_open)
1140 {
1141 int ret = 0;
1142
1143 LTTNG_ASSERT(channel);
1144
1145 /* Opening channel element */
1146 ret = mi_lttng_writer_open_element(writer, config_element_channel);
1147 if (ret) {
1148 goto end;
1149 }
1150
1151 /* Name */
1152 ret = mi_lttng_writer_write_element_string(writer, config_element_name,
1153 channel->name);
1154 if (ret) {
1155 goto end;
1156 }
1157
1158 /* Enabled ? */
1159 ret = mi_lttng_writer_write_element_bool(writer,
1160 config_element_enabled, channel->enabled);
1161 if (ret) {
1162 goto end;
1163 }
1164
1165 /* Attribute */
1166 ret = mi_lttng_channel_attr(writer, &channel->attr);
1167 if (ret) {
1168 goto end;
1169 }
1170
1171 if (!is_open) {
1172 /* Closing channel element */
1173 ret = mi_lttng_writer_close_element(writer);
1174 if (ret) {
1175 goto end;
1176 }
1177 }
1178 end:
1179 return ret;
1180 }
1181
1182 int mi_lttng_channel_attr(struct mi_writer *writer,
1183 struct lttng_channel_attr *attr)
1184 {
1185 int ret = 0;
1186 struct lttng_channel *chan = caa_container_of(attr,
1187 struct lttng_channel, attr);
1188 uint64_t discarded_events, lost_packets, monitor_timer_interval;
1189 int64_t blocking_timeout;
1190
1191 LTTNG_ASSERT(attr);
1192
1193 ret = lttng_channel_get_discarded_event_count(chan, &discarded_events);
1194 if (ret) {
1195 goto end;
1196 }
1197
1198 ret = lttng_channel_get_lost_packet_count(chan, &lost_packets);
1199 if (ret) {
1200 goto end;
1201 }
1202
1203 ret = lttng_channel_get_monitor_timer_interval(chan,
1204 &monitor_timer_interval);
1205 if (ret) {
1206 goto end;
1207 }
1208
1209 ret = lttng_channel_get_blocking_timeout(chan,
1210 &blocking_timeout);
1211 if (ret) {
1212 goto end;
1213 }
1214
1215 /* Opening Attributes */
1216 ret = mi_lttng_writer_open_element(writer, config_element_attributes);
1217 if (ret) {
1218 goto end;
1219 }
1220
1221 /* Overwrite */
1222 ret = mi_lttng_writer_write_element_string(writer,
1223 config_element_overwrite_mode,
1224 attr->overwrite ? config_overwrite_mode_overwrite :
1225 config_overwrite_mode_discard);
1226 if (ret) {
1227 goto end;
1228 }
1229
1230 /* Sub buffer size in byte */
1231 ret = mi_lttng_writer_write_element_unsigned_int(writer,
1232 config_element_subbuf_size, attr->subbuf_size);
1233 if (ret) {
1234 goto end;
1235 }
1236
1237 /* Number of subbuffer (power of two) */
1238 ret = mi_lttng_writer_write_element_unsigned_int(writer,
1239 config_element_num_subbuf,
1240 attr->num_subbuf);
1241 if (ret) {
1242 goto end;
1243 }
1244
1245 /* Switch timer interval in usec */
1246 ret = mi_lttng_writer_write_element_unsigned_int(writer,
1247 config_element_switch_timer_interval,
1248 attr->switch_timer_interval);
1249 if (ret) {
1250 goto end;
1251 }
1252
1253 /* Read timer interval in usec */
1254 ret = mi_lttng_writer_write_element_unsigned_int(writer,
1255 config_element_read_timer_interval,
1256 attr->read_timer_interval);
1257 if (ret) {
1258 goto end;
1259 }
1260
1261 /* Monitor timer interval in usec */
1262 ret = mi_lttng_writer_write_element_unsigned_int(writer,
1263 config_element_monitor_timer_interval,
1264 monitor_timer_interval);
1265 if (ret) {
1266 goto end;
1267 }
1268
1269 /* Retry timeout in usec */
1270 ret = mi_lttng_writer_write_element_signed_int(writer,
1271 config_element_blocking_timeout,
1272 blocking_timeout);
1273 if (ret) {
1274 goto end;
1275 }
1276
1277 /* Event output */
1278 ret = mi_lttng_writer_write_element_string(writer,
1279 config_element_output_type,
1280 attr->output == LTTNG_EVENT_SPLICE ?
1281 config_output_type_splice : config_output_type_mmap);
1282 if (ret) {
1283 goto end;
1284 }
1285
1286 /* Tracefile size in bytes */
1287 ret = mi_lttng_writer_write_element_unsigned_int(writer,
1288 config_element_tracefile_size, attr->tracefile_size);
1289 if (ret) {
1290 goto end;
1291 }
1292
1293 /* Count of tracefiles */
1294 ret = mi_lttng_writer_write_element_unsigned_int(writer,
1295 config_element_tracefile_count,
1296 attr->tracefile_count);
1297 if (ret) {
1298 goto end;
1299 }
1300
1301 /* Live timer interval in usec*/
1302 ret = mi_lttng_writer_write_element_unsigned_int(writer,
1303 config_element_live_timer_interval,
1304 attr->live_timer_interval);
1305 if (ret) {
1306 goto end;
1307 }
1308
1309 /* Discarded events */
1310 ret = mi_lttng_writer_write_element_unsigned_int(writer,
1311 config_element_discarded_events,
1312 discarded_events);
1313 if (ret) {
1314 goto end;
1315 }
1316
1317 /* Lost packets */
1318 ret = mi_lttng_writer_write_element_unsigned_int(writer,
1319 config_element_lost_packets,
1320 lost_packets);
1321 if (ret) {
1322 goto end;
1323 }
1324
1325 /* Closing attributes */
1326 ret = mi_lttng_writer_close_element(writer);
1327 if (ret) {
1328 goto end;
1329 }
1330 end:
1331 return ret;
1332
1333 }
1334
1335 int mi_lttng_event_common_attributes(struct mi_writer *writer,
1336 struct lttng_event *event)
1337 {
1338 int ret;
1339 const char *filter_expression;
1340
1341 /* Open event element */
1342 ret = mi_lttng_writer_open_element(writer, config_element_event);
1343 if (ret) {
1344 goto end;
1345 }
1346
1347 /* Event name */
1348 ret = mi_lttng_writer_write_element_string(writer,
1349 config_element_name, event->name);
1350 if (ret) {
1351 goto end;
1352 }
1353
1354 /* Event type */
1355 ret = mi_lttng_writer_write_element_string(writer,
1356 config_element_type, mi_lttng_eventtype_string(event->type));
1357 if (ret) {
1358 goto end;
1359 }
1360
1361 /* Is event enabled */
1362 ret = mi_lttng_writer_write_element_bool(writer,
1363 config_element_enabled, event->enabled);
1364 if (ret) {
1365 goto end;
1366 }
1367
1368 /* Event filter expression */
1369 ret = lttng_event_get_filter_expression(event, &filter_expression);
1370 if (ret) {
1371 goto end;
1372 }
1373
1374 if (filter_expression) {
1375 ret = mi_lttng_writer_write_element_string(writer,
1376 config_element_filter_expression,
1377 filter_expression);
1378 if (ret) {
1379 goto end;
1380 }
1381 }
1382
1383 end:
1384 return ret;
1385 }
1386
1387 static int write_event_exclusions(struct mi_writer *writer,
1388 struct lttng_event *event)
1389 {
1390 int i;
1391 int ret;
1392 int exclusion_count;
1393
1394 /* Open event exclusions */
1395 ret = mi_lttng_writer_open_element(writer, config_element_exclusions);
1396 if (ret) {
1397 goto end;
1398 }
1399
1400 exclusion_count = lttng_event_get_exclusion_name_count(event);
1401 if (exclusion_count < 0) {
1402 ret = exclusion_count;
1403 goto end;
1404 }
1405
1406 for (i = 0; i < exclusion_count; i++) {
1407 const char *name;
1408
1409 ret = lttng_event_get_exclusion_name(event, i, &name);
1410 if (ret) {
1411 /* Close exclusions */
1412 mi_lttng_writer_close_element(writer);
1413 goto end;
1414 }
1415
1416 ret = mi_lttng_writer_write_element_string(writer,
1417 config_element_exclusion, name);
1418 if (ret) {
1419 /* Close exclusions */
1420 mi_lttng_writer_close_element(writer);
1421 goto end;
1422 }
1423 }
1424
1425 /* Close exclusions */
1426 ret = mi_lttng_writer_close_element(writer);
1427
1428 end:
1429 return ret;
1430 }
1431
1432 int mi_lttng_event_tracepoint_loglevel(struct mi_writer *writer,
1433 struct lttng_event *event, enum lttng_domain_type domain)
1434 {
1435 int ret;
1436
1437 /* Event loglevel */
1438 ret = mi_lttng_writer_write_element_string(writer,
1439 config_element_loglevel,
1440 mi_lttng_loglevel_string(event->loglevel, domain));
1441 if (ret) {
1442 goto end;
1443 }
1444
1445 /* Log level type */
1446 ret = mi_lttng_writer_write_element_string(writer,
1447 config_element_loglevel_type,
1448 mi_lttng_logleveltype_string(event->loglevel_type));
1449 if (ret) {
1450 goto end;
1451 }
1452
1453 /* Event exclusions */
1454 ret = write_event_exclusions(writer, event);
1455
1456 end:
1457 return ret;
1458 }
1459
1460 int mi_lttng_event_tracepoint_no_loglevel(struct mi_writer *writer,
1461 struct lttng_event *event)
1462 {
1463 /* event exclusion filter */
1464 return write_event_exclusions(writer, event);
1465 }
1466
1467 int mi_lttng_event_function_probe(struct mi_writer *writer,
1468 struct lttng_event *event)
1469 {
1470 int ret;
1471
1472 ret = mi_lttng_writer_open_element(writer, config_element_attributes);
1473 if (ret) {
1474 goto end;
1475 }
1476
1477 ret = mi_lttng_writer_open_element(writer, config_element_probe_attributes);
1478 if (ret) {
1479 goto end;
1480 }
1481
1482 if (event->attr.probe.addr != 0) {
1483 /* event probe address */
1484 ret = mi_lttng_writer_write_element_unsigned_int(writer,
1485 config_element_address, event->attr.probe.addr);
1486 if (ret) {
1487 goto end;
1488 }
1489 } else {
1490 /* event probe offset */
1491 ret = mi_lttng_writer_write_element_unsigned_int(writer,
1492 config_element_offset, event->attr.probe.offset);
1493 if (ret) {
1494 goto end;
1495 }
1496
1497 /* event probe symbol_name */
1498 ret = mi_lttng_writer_write_element_string(writer,
1499 config_element_symbol_name, event->attr.probe.symbol_name);
1500 if (ret) {
1501 goto end;
1502 }
1503 }
1504
1505 /* Close probe_attributes and attributes */
1506 ret = mi_lttng_close_multi_element(writer, 2);
1507 end:
1508 return ret;
1509 }
1510
1511 static
1512 int mi_lttng_event_userspace_probe(struct mi_writer *writer,
1513 struct lttng_event *event)
1514 {
1515 int ret;
1516 const struct lttng_userspace_probe_location *location;
1517 const struct lttng_userspace_probe_location_lookup_method *lookup_method;
1518 enum lttng_userspace_probe_location_lookup_method_type lookup_type;
1519
1520 location = lttng_event_get_userspace_probe_location(event);
1521 if (!location) {
1522 ret = -LTTNG_ERR_INVALID;
1523 goto end;
1524 }
1525
1526 lookup_method = lttng_userspace_probe_location_get_lookup_method(location);
1527 if (!lookup_method) {
1528 ret = -LTTNG_ERR_INVALID;
1529 goto end;
1530 }
1531
1532 lookup_type = lttng_userspace_probe_location_lookup_method_get_type(lookup_method);
1533
1534 ret = mi_lttng_writer_open_element(writer, config_element_attributes);
1535 if (ret) {
1536 goto end;
1537 }
1538
1539 switch (lttng_userspace_probe_location_get_type(location)) {
1540 case LTTNG_USERSPACE_PROBE_LOCATION_TYPE_FUNCTION:
1541 {
1542 const char *function_name;
1543 const char *binary_path;
1544
1545 ret = mi_lttng_writer_open_element(writer,
1546 config_element_userspace_probe_function_attributes);
1547 if (ret) {
1548 goto end;
1549 }
1550
1551 switch (lookup_type) {
1552 case LTTNG_USERSPACE_PROBE_LOCATION_LOOKUP_METHOD_TYPE_FUNCTION_ELF:
1553 ret = mi_lttng_writer_write_element_string(writer,
1554 config_element_userspace_probe_lookup,
1555 config_element_userspace_probe_lookup_function_elf);
1556 if (ret) {
1557 goto end;
1558 }
1559 break;
1560 case LTTNG_USERSPACE_PROBE_LOCATION_LOOKUP_METHOD_TYPE_FUNCTION_DEFAULT:
1561 ret = mi_lttng_writer_write_element_string(writer,
1562 config_element_userspace_probe_lookup,
1563 config_element_userspace_probe_lookup_function_default);
1564 if (ret) {
1565 goto end;
1566 }
1567 break;
1568 default:
1569 goto end;
1570 }
1571
1572 binary_path = lttng_userspace_probe_location_function_get_binary_path(location);
1573 ret = mi_lttng_writer_write_element_string(writer,
1574 config_element_userspace_probe_location_binary_path, binary_path);
1575 if (ret) {
1576 goto end;
1577 }
1578
1579 function_name = lttng_userspace_probe_location_function_get_function_name(location);
1580 ret = mi_lttng_writer_write_element_string(writer,
1581 config_element_userspace_probe_function_location_function_name,
1582 function_name);
1583 if (ret) {
1584 goto end;
1585 }
1586
1587 break;
1588 }
1589 case LTTNG_USERSPACE_PROBE_LOCATION_TYPE_TRACEPOINT:
1590 {
1591 const char *probe_name, *provider_name;
1592 const char *binary_path;
1593
1594 ret = mi_lttng_writer_open_element(writer,
1595 config_element_userspace_probe_function_attributes);
1596 if (ret) {
1597 goto end;
1598 }
1599
1600 switch (lookup_type) {
1601 case LTTNG_USERSPACE_PROBE_LOCATION_LOOKUP_METHOD_TYPE_TRACEPOINT_SDT:
1602 ret = mi_lttng_writer_write_element_string(writer,
1603 config_element_userspace_probe_lookup,
1604 config_element_userspace_probe_lookup_tracepoint_sdt);
1605 if (ret) {
1606 goto end;
1607 }
1608 break;
1609 default:
1610 goto end;
1611 }
1612
1613 binary_path = lttng_userspace_probe_location_tracepoint_get_binary_path(location);
1614 ret = mi_lttng_writer_write_element_string(writer,
1615 config_element_userspace_probe_location_binary_path,
1616 binary_path);
1617 if (ret) {
1618 goto end;
1619 }
1620
1621 provider_name = lttng_userspace_probe_location_tracepoint_get_provider_name(location);
1622 ret = mi_lttng_writer_write_element_string(writer,
1623 config_element_userspace_probe_tracepoint_location_provider_name,
1624 provider_name);
1625 if (ret) {
1626 goto end;
1627 }
1628
1629 probe_name = lttng_userspace_probe_location_tracepoint_get_probe_name(location);
1630 ret = mi_lttng_writer_write_element_string(writer,
1631 config_element_userspace_probe_tracepoint_location_probe_name, probe_name);
1632 if (ret) {
1633 goto end;
1634 }
1635 break;
1636 }
1637 default:
1638 ERR("Invalid probe type encountered");
1639 }
1640 /* Close probe_attributes and attributes */
1641 ret = mi_lttng_close_multi_element(writer, 2);
1642 end:
1643 return ret;
1644 }
1645
1646 int mi_lttng_event_function_entry(struct mi_writer *writer,
1647 struct lttng_event *event)
1648 {
1649 int ret;
1650
1651 ret = mi_lttng_writer_open_element(writer, config_element_attributes);
1652 if (ret) {
1653 goto end;
1654 }
1655
1656 ret = mi_lttng_writer_open_element(writer, config_element_probe_attributes);
1657 if (ret) {
1658 goto end;
1659 }
1660
1661 /* event probe symbol_name */
1662 ret = mi_lttng_writer_write_element_string(writer,
1663 config_element_symbol_name, event->attr.ftrace.symbol_name);
1664 if (ret) {
1665 goto end;
1666 }
1667
1668 /* Close function_attributes and attributes */
1669 ret = mi_lttng_close_multi_element(writer, 2);
1670 end:
1671 return ret;
1672 }
1673
1674 int mi_lttng_events_open(struct mi_writer *writer)
1675 {
1676 return mi_lttng_writer_open_element(writer, config_element_events);
1677 }
1678
1679 int mi_lttng_event(struct mi_writer *writer,
1680 struct lttng_event *event, int is_open, enum lttng_domain_type domain)
1681 {
1682 int ret;
1683
1684 ret = mi_lttng_event_common_attributes(writer, event);
1685 if (ret) {
1686 goto end;
1687 }
1688
1689 switch (event->type) {
1690 case LTTNG_EVENT_TRACEPOINT:
1691 {
1692 if (event->loglevel != -1) {
1693 ret = mi_lttng_event_tracepoint_loglevel(writer, event, domain);
1694 } else {
1695 ret = mi_lttng_event_tracepoint_no_loglevel(writer, event);
1696 }
1697 break;
1698 }
1699 case LTTNG_EVENT_FUNCTION:
1700 /* Fallthrough */
1701 case LTTNG_EVENT_PROBE:
1702 ret = mi_lttng_event_function_probe(writer, event);
1703 break;
1704 case LTTNG_EVENT_FUNCTION_ENTRY:
1705 ret = mi_lttng_event_function_entry(writer, event);
1706 break;
1707 case LTTNG_EVENT_USERSPACE_PROBE:
1708 ret = mi_lttng_event_userspace_probe(writer, event);
1709 break;
1710 case LTTNG_EVENT_ALL:
1711 /* Fallthrough */
1712 default:
1713 break;
1714 }
1715
1716 if (ret) {
1717 goto end;
1718 }
1719
1720 if (!is_open) {
1721 ret = mi_lttng_writer_close_element(writer);
1722 }
1723
1724 end:
1725 return ret;
1726 }
1727
1728 int mi_lttng_trackers_open(struct mi_writer *writer)
1729 {
1730 return mi_lttng_writer_open_element(
1731 writer, config_element_process_attr_trackers);
1732 }
1733
1734 static int get_tracker_elements(enum lttng_process_attr process_attr,
1735 const char **element_process_attr_tracker,
1736 const char **element_process_attr_value)
1737 {
1738 int ret = 0;
1739
1740 switch (process_attr) {
1741 case LTTNG_PROCESS_ATTR_PROCESS_ID:
1742 *element_process_attr_tracker =
1743 config_element_process_attr_tracker_pid;
1744 *element_process_attr_value =
1745 config_element_process_attr_pid_value;
1746 break;
1747 case LTTNG_PROCESS_ATTR_VIRTUAL_PROCESS_ID:
1748 *element_process_attr_tracker =
1749 config_element_process_attr_tracker_vpid;
1750 *element_process_attr_value =
1751 config_element_process_attr_vpid_value;
1752 break;
1753 case LTTNG_PROCESS_ATTR_USER_ID:
1754 *element_process_attr_tracker =
1755 config_element_process_attr_tracker_uid;
1756 *element_process_attr_value =
1757 config_element_process_attr_uid_value;
1758 break;
1759 case LTTNG_PROCESS_ATTR_VIRTUAL_USER_ID:
1760 *element_process_attr_tracker =
1761 config_element_process_attr_tracker_vuid;
1762 *element_process_attr_value =
1763 config_element_process_attr_vuid_value;
1764 break;
1765 case LTTNG_PROCESS_ATTR_GROUP_ID:
1766 *element_process_attr_tracker =
1767 config_element_process_attr_tracker_gid;
1768 *element_process_attr_value =
1769 config_element_process_attr_gid_value;
1770 break;
1771 case LTTNG_PROCESS_ATTR_VIRTUAL_GROUP_ID:
1772 *element_process_attr_tracker =
1773 config_element_process_attr_tracker_vgid;
1774 *element_process_attr_value =
1775 config_element_process_attr_vgid_value;
1776 break;
1777 default:
1778 ret = LTTNG_ERR_SAVE_IO_FAIL;
1779 }
1780 return ret;
1781 }
1782
1783 int mi_lttng_process_attribute_tracker_open(
1784 struct mi_writer *writer, enum lttng_process_attr process_attr)
1785 {
1786 int ret;
1787 const char *element_tracker, *element_value;
1788
1789 ret = get_tracker_elements(
1790 process_attr, &element_tracker, &element_value);
1791 if (ret) {
1792 return ret;
1793 }
1794
1795 /* Open process attribute tracker element */
1796 ret = mi_lttng_writer_open_element(writer, element_tracker);
1797 if (ret) {
1798 goto end;
1799 }
1800
1801 /* Open values element */
1802 ret = mi_lttng_process_attr_values_open(writer);
1803 end:
1804 return ret;
1805 }
1806
1807 int mi_lttng_pids_open(struct mi_writer *writer)
1808 {
1809 return mi_lttng_writer_open_element(writer, config_element_pids);
1810 }
1811
1812 /*
1813 * TODO: move the listing of pid for user agent to process semantic on
1814 * mi api bump. The use of process element break the mi api.
1815 */
1816 int mi_lttng_pid(struct mi_writer *writer,
1817 pid_t pid,
1818 const char *name,
1819 int is_open)
1820 {
1821 int ret;
1822
1823 /* Open pid process */
1824 ret = mi_lttng_writer_open_element(writer, config_element_pid);
1825 if (ret) {
1826 goto end;
1827 }
1828
1829 /* Writing pid number */
1830 ret = mi_lttng_writer_write_element_signed_int(writer,
1831 mi_lttng_element_pid_id, (int)pid);
1832 if (ret) {
1833 goto end;
1834 }
1835
1836 /* Writing name of the process */
1837 if (name) {
1838 ret = mi_lttng_writer_write_element_string(writer, config_element_name,
1839 name);
1840 if (ret) {
1841 goto end;
1842 }
1843 }
1844
1845 if (!is_open) {
1846 /* Closing Pid */
1847 ret = mi_lttng_writer_close_element(writer);
1848 }
1849
1850 end:
1851 return ret;
1852 }
1853
1854 int mi_lttng_process_attr_values_open(struct mi_writer *writer)
1855 {
1856 return mi_lttng_writer_open_element(
1857 writer, config_element_process_attr_values);
1858 }
1859
1860 int mi_lttng_all_process_attribute_value(struct mi_writer *writer,
1861 enum lttng_process_attr process_attr,
1862 bool is_open)
1863 {
1864 int ret;
1865 const char *element_id_tracker, *element_target_id;
1866
1867 ret = get_tracker_elements(
1868 process_attr, &element_id_tracker, &element_target_id);
1869 if (ret) {
1870 return ret;
1871 }
1872
1873 ret = mi_lttng_writer_open_element(writer, element_target_id);
1874 if (ret) {
1875 goto end;
1876 }
1877
1878 ret = mi_lttng_writer_open_element(writer, config_element_type);
1879 if (ret) {
1880 goto end;
1881 }
1882
1883 ret = mi_lttng_writer_write_element_bool(writer, config_element_all, 1);
1884 if (ret) {
1885 goto end;
1886 }
1887
1888 ret = mi_lttng_writer_close_element(writer);
1889 if (ret) {
1890 goto end;
1891 }
1892
1893 if (!is_open) {
1894 ret = mi_lttng_writer_close_element(writer);
1895 if (ret) {
1896 goto end;
1897 }
1898 }
1899 end:
1900 return ret;
1901 }
1902
1903 int mi_lttng_integral_process_attribute_value(struct mi_writer *writer,
1904 enum lttng_process_attr process_attr,
1905 int64_t value,
1906 bool is_open)
1907 {
1908 int ret;
1909 const char *element_id_tracker, *element_target_id;
1910
1911 ret = get_tracker_elements(
1912 process_attr, &element_id_tracker, &element_target_id);
1913 if (ret) {
1914 return ret;
1915 }
1916
1917 ret = mi_lttng_writer_open_element(writer, element_target_id);
1918 if (ret) {
1919 goto end;
1920 }
1921
1922 ret = mi_lttng_writer_open_element(writer, config_element_type);
1923 if (ret) {
1924 goto end;
1925 }
1926
1927 ret = mi_lttng_writer_write_element_signed_int(
1928 writer, config_element_process_attr_id, value);
1929 if (ret) {
1930 goto end;
1931 }
1932
1933 ret = mi_lttng_writer_close_element(writer);
1934 if (ret) {
1935 goto end;
1936 }
1937
1938 if (!is_open) {
1939 ret = mi_lttng_writer_close_element(writer);
1940 if (ret) {
1941 goto end;
1942 }
1943 }
1944
1945 end:
1946 return ret;
1947 }
1948
1949 int mi_lttng_string_process_attribute_value(struct mi_writer *writer,
1950 enum lttng_process_attr process_attr,
1951 const char *value,
1952 bool is_open)
1953
1954 {
1955 int ret;
1956 const char *element_id_tracker, *element_target_id;
1957
1958 ret = get_tracker_elements(
1959 process_attr, &element_id_tracker, &element_target_id);
1960 if (ret) {
1961 return ret;
1962 }
1963
1964 ret = mi_lttng_writer_open_element(writer, element_target_id);
1965 if (ret) {
1966 goto end;
1967 }
1968
1969 ret = mi_lttng_writer_open_element(writer, config_element_type);
1970 if (ret) {
1971 goto end;
1972 }
1973
1974 ret = mi_lttng_writer_write_element_string(
1975 writer, config_element_name, value);
1976 if (ret) {
1977 goto end;
1978 }
1979
1980 ret = mi_lttng_writer_close_element(writer);
1981 if (ret) {
1982 goto end;
1983 }
1984
1985 if (!is_open) {
1986 ret = mi_lttng_writer_close_element(writer);
1987 if (ret) {
1988 goto end;
1989 }
1990 }
1991
1992 end:
1993 return ret;
1994 }
1995
1996 int mi_lttng_event_fields_open(struct mi_writer *writer)
1997 {
1998 return mi_lttng_writer_open_element(writer, mi_lttng_element_event_fields);
1999 }
2000
2001 int mi_lttng_event_field(struct mi_writer *writer,
2002 struct lttng_event_field *field)
2003 {
2004 int ret;
2005
2006 if (!field->field_name[0]) {
2007 ret = 0;
2008 goto end;
2009 }
2010
2011 /* Open field */
2012 ret = mi_lttng_writer_open_element(writer, mi_lttng_element_event_field);
2013 if (ret) {
2014 goto end;
2015 }
2016
2017 if (!field->field_name[0]) {
2018 goto close;
2019 }
2020
2021 /* Name */
2022 ret = mi_lttng_writer_write_element_string(writer, config_element_name,
2023 field->field_name);
2024 if (ret) {
2025 goto end;
2026 }
2027
2028 /* Type */
2029 ret = mi_lttng_writer_write_element_string(writer, config_element_type,
2030 mi_lttng_eventfieldtype_string(field->type));
2031 if (ret) {
2032 goto end;
2033 }
2034
2035 /* nowrite */
2036 ret = mi_lttng_writer_write_element_signed_int(writer,
2037 mi_lttng_element_nowrite, field->nowrite);
2038 if (ret) {
2039 goto end;
2040 }
2041
2042 close:
2043 /* Close field element */
2044 ret = mi_lttng_writer_close_element(writer);
2045
2046 end:
2047 return ret;
2048 }
2049
2050 int mi_lttng_perf_counter_context(struct mi_writer *writer,
2051 struct lttng_event_perf_counter_ctx *perf_context)
2052 {
2053 int ret;
2054
2055 /* Open perf_counter_context */
2056 ret = mi_lttng_writer_open_element(writer,
2057 mi_lttng_element_perf_counter_context);
2058 if (ret) {
2059 goto end;
2060 }
2061
2062 /* Type */
2063 ret = mi_lttng_writer_write_element_unsigned_int(writer,
2064 config_element_type, perf_context->type);
2065 if (ret) {
2066 goto end;
2067 }
2068
2069 /* Config */
2070 ret = mi_lttng_writer_write_element_unsigned_int(writer,
2071 config_element_config, perf_context->config);
2072 if (ret) {
2073 goto end;
2074 }
2075
2076 /* Name of the perf counter */
2077 ret = mi_lttng_writer_write_element_string(writer,
2078 config_element_name, perf_context->name);
2079 if (ret) {
2080 goto end;
2081 }
2082
2083 /* Close perf_counter_context */
2084 ret = mi_lttng_writer_close_element(writer);
2085 end:
2086 return ret;
2087 }
2088
2089 static
2090 int mi_lttng_app_context(struct mi_writer *writer,
2091 const char *provider_name, const char *ctx_name)
2092 {
2093 int ret;
2094
2095 /* Open app */
2096 ret = mi_lttng_writer_open_element(writer,
2097 config_element_context_app);
2098 if (ret) {
2099 goto end;
2100 }
2101
2102 /* provider_name */
2103 ret = mi_lttng_writer_write_element_string(writer,
2104 config_element_context_app_provider_name,
2105 provider_name);
2106 if (ret) {
2107 goto end;
2108 }
2109
2110 /* ctx_name */
2111 ret = mi_lttng_writer_write_element_string(writer,
2112 config_element_context_app_ctx_name, ctx_name);
2113 if (ret) {
2114 goto end;
2115 }
2116
2117 /* Close app */
2118 ret = mi_lttng_writer_close_element(writer);
2119 end:
2120 return ret;
2121 }
2122
2123 int mi_lttng_context(struct mi_writer *writer,
2124 struct lttng_event_context *context, int is_open)
2125 {
2126 int ret;
2127
2128 /* Open context */
2129 ret = mi_lttng_writer_open_element(writer , config_element_context);
2130 if (ret) {
2131 goto end;
2132 }
2133
2134 /* Special case for PERF_*_COUNTER
2135 * print the lttng_event_perf_counter_ctx*/
2136 switch (context->ctx) {
2137 case LTTNG_EVENT_CONTEXT_PERF_COUNTER:
2138 case LTTNG_EVENT_CONTEXT_PERF_THREAD_COUNTER:
2139 case LTTNG_EVENT_CONTEXT_PERF_CPU_COUNTER:
2140 {
2141 struct lttng_event_perf_counter_ctx *perf_context =
2142 &context->u.perf_counter;
2143 ret = mi_lttng_perf_counter_context(writer, perf_context);
2144 if (ret) {
2145 goto end;
2146 }
2147 break;
2148 }
2149 case LTTNG_EVENT_CONTEXT_APP_CONTEXT:
2150 {
2151 ret = mi_lttng_app_context(writer,
2152 context->u.app_ctx.provider_name,
2153 context->u.app_ctx.ctx_name);
2154 if (ret) {
2155 goto end;
2156 }
2157 break;
2158 }
2159 default:
2160 {
2161 const char *type_string = mi_lttng_event_contexttype_string(
2162 context->ctx);
2163 if (!type_string) {
2164 ret = -LTTNG_ERR_INVALID;
2165 goto end;
2166 }
2167
2168 /* Print context type */
2169 ret = mi_lttng_writer_write_element_string(writer,
2170 config_element_type, type_string);
2171 break;
2172 }
2173 }
2174
2175 /* Close context */
2176 if (!is_open) {
2177 ret = mi_lttng_writer_close_element(writer);
2178 }
2179
2180 end:
2181 return ret;
2182 }
2183
2184 int mi_lttng_snapshot_output_session_name(struct mi_writer *writer,
2185 const char *session_name)
2186 {
2187 int ret;
2188
2189 /* Open session element */
2190 ret = mi_lttng_writer_open_element(writer, config_element_session);
2191 if (ret) {
2192 goto end;
2193 }
2194
2195 /* Snapshot output list for current session name */
2196 ret = mi_lttng_writer_write_element_string(writer, config_element_name,
2197 session_name);
2198 if (ret) {
2199 goto end;
2200 }
2201
2202 /* Open element snapshots (sequence one snapshot) */
2203 ret = mi_lttng_writer_open_element(writer, mi_lttng_element_snapshots);
2204 if (ret) {
2205 goto end;
2206 }
2207
2208 end:
2209 return ret;
2210 }
2211
2212 int mi_lttng_snapshot_list_output(struct mi_writer *writer,
2213 const struct lttng_snapshot_output *output)
2214 {
2215 int ret;
2216
2217 /* Open element snapshot output */
2218 ret = mi_lttng_writer_open_element(writer,
2219 mi_lttng_element_command_snapshot);
2220 if (ret) {
2221 goto end;
2222 }
2223
2224 /* ID of the snapshot output */
2225 ret = mi_lttng_writer_write_element_unsigned_int(writer,
2226 mi_lttng_element_id, output->id);
2227 if (ret) {
2228 goto end;
2229 }
2230
2231 /* Name of the output */
2232 ret = mi_lttng_writer_write_element_string(writer, config_element_name,
2233 output->name);
2234 if (ret) {
2235 goto end;
2236 }
2237
2238 /* Destination of the output (ctrl_url)*/
2239 ret = mi_lttng_writer_write_element_string(writer,
2240 mi_lttng_element_snapshot_ctrl_url, output->ctrl_url);
2241 if (ret) {
2242 goto end;
2243 }
2244
2245 /* Destination of the output (data_url) */
2246 ret = mi_lttng_writer_write_element_string(writer,
2247 mi_lttng_element_snapshot_data_url, output->data_url);
2248 if (ret) {
2249 goto end;
2250 }
2251
2252 /* total size of all stream combined */
2253 ret = mi_lttng_writer_write_element_unsigned_int(writer,
2254 mi_lttng_element_snapshot_max_size, output->max_size);
2255 if (ret) {
2256 goto end;
2257 }
2258
2259 /* Close snapshot output element */
2260 ret = mi_lttng_writer_close_element(writer);
2261
2262 end:
2263 return ret;
2264 }
2265
2266 int mi_lttng_snapshot_del_output(struct mi_writer *writer, int id,
2267 const char *name, const char *current_session_name)
2268 {
2269 int ret;
2270
2271 /* Open element del_snapshot */
2272 ret = mi_lttng_writer_open_element(writer,
2273 mi_lttng_element_command_snapshot);
2274 if (ret) {
2275 goto end;
2276 }
2277
2278
2279 if (id != UINT32_MAX) {
2280 /* "Snapshot output "id" successfully deleted
2281 * for "current_session_name"
2282 * ID of the snapshot output
2283 */
2284 ret = mi_lttng_writer_write_element_unsigned_int(writer,
2285 mi_lttng_element_id, id);
2286 if (ret) {
2287 goto end;
2288 }
2289 } else {
2290 /* "Snapshot output "name" successfully deleted
2291 * for session "current_session_name"
2292 * Name of the output
2293 */
2294 ret = mi_lttng_writer_write_element_string(writer, config_element_name,
2295 name);
2296 if (ret) {
2297 goto end;
2298 }
2299 }
2300
2301 /* Snapshot was deleted for session "current_session_name"*/
2302 ret = mi_lttng_writer_write_element_string(writer,
2303 mi_lttng_element_snapshot_session_name,
2304 current_session_name);
2305 if (ret) {
2306 goto end;
2307 }
2308
2309 /* Close snapshot element */
2310 ret = mi_lttng_writer_close_element(writer);
2311
2312 end:
2313 return ret;
2314 }
2315
2316 int mi_lttng_snapshot_add_output(struct mi_writer *writer,
2317 const char *current_session_name, const char *n_ptr,
2318 struct lttng_snapshot_output *output)
2319 {
2320 int ret;
2321
2322 /* Open element snapshot */
2323 ret = mi_lttng_writer_open_element(writer,
2324 mi_lttng_element_command_snapshot);
2325 if (ret) {
2326 goto end;
2327 }
2328
2329 /* Snapshot output id */
2330 ret = mi_lttng_writer_write_element_unsigned_int(writer,
2331 mi_lttng_element_id, output->id);
2332 if (ret) {
2333 goto end;
2334 }
2335
2336 /* Snapshot output names */
2337 ret = mi_lttng_writer_write_element_string(writer,
2338 config_element_name, n_ptr);
2339 if (ret) {
2340 goto end;
2341 }
2342
2343 /* Destination of the output (ctrl_url)*/
2344 ret = mi_lttng_writer_write_element_string(writer,
2345 mi_lttng_element_snapshot_ctrl_url, output->ctrl_url);
2346 if (ret) {
2347 goto end;
2348 }
2349
2350 /* Snapshot added for session "current_session_name"*/
2351 ret = mi_lttng_writer_write_element_string(writer,
2352 mi_lttng_element_snapshot_session_name, current_session_name);
2353 if (ret) {
2354 goto end;
2355 }
2356
2357 /* total size of all stream combined */
2358 ret = mi_lttng_writer_write_element_unsigned_int(writer,
2359 mi_lttng_element_snapshot_max_size, output->max_size);
2360 if (ret) {
2361 goto end;
2362 }
2363
2364 /* Close snapshot element */
2365 ret = mi_lttng_writer_close_element(writer);
2366
2367 end:
2368 return ret;
2369 }
2370
2371 int mi_lttng_snapshot_record(struct mi_writer *writer,
2372 const char *current_session_name, const char *url,
2373 const char *cmdline_ctrl_url, const char *cmdline_data_url)
2374 {
2375 int ret;
2376
2377 /* Open element snapshot */
2378 ret = mi_lttng_writer_open_element(writer,
2379 mi_lttng_element_command_snapshot);
2380 if (ret) {
2381 goto end;
2382 }
2383
2384 /*
2385 * If a valid an URL was given, serialize it,
2386 * else take the command line data and ctrl urls*/
2387 if (url) {
2388 /* Destination of the output (ctrl_url)*/
2389 ret = mi_lttng_writer_write_element_string(writer,
2390 mi_lttng_element_snapshot_ctrl_url, url);
2391 if (ret) {
2392 goto end;
2393 }
2394 } else if (cmdline_ctrl_url) {
2395 /* Destination of the output (ctrl_url)*/
2396 ret = mi_lttng_writer_write_element_string(writer,
2397 mi_lttng_element_snapshot_ctrl_url, cmdline_ctrl_url);
2398 if (ret) {
2399 goto end;
2400 }
2401
2402 /* Destination of the output (data_url) */
2403 ret = mi_lttng_writer_write_element_string(writer,
2404 mi_lttng_element_snapshot_data_url, cmdline_data_url);
2405 if (ret) {
2406 goto end;
2407 }
2408 }
2409
2410 /* Close record_snapshot element */
2411 ret = mi_lttng_writer_close_element(writer);
2412
2413 end:
2414 return ret;
2415 }
2416
2417 int mi_lttng_rotation_schedule(struct mi_writer *writer,
2418 const struct lttng_rotation_schedule *schedule)
2419 {
2420 int ret = 0;
2421 enum lttng_rotation_status status;
2422 uint64_t value;
2423 const char *element_name;
2424 const char *value_name;
2425 bool empty_schedule = false;
2426
2427 switch (lttng_rotation_schedule_get_type(schedule)) {
2428 case LTTNG_ROTATION_SCHEDULE_TYPE_PERIODIC:
2429 status = lttng_rotation_schedule_periodic_get_period(schedule,
2430 &value);
2431 element_name = mi_lttng_element_rotation_schedule_periodic;
2432 value_name = mi_lttng_element_rotation_schedule_periodic_time_us;
2433 break;
2434 case LTTNG_ROTATION_SCHEDULE_TYPE_SIZE_THRESHOLD:
2435 status = lttng_rotation_schedule_size_threshold_get_threshold(
2436 schedule, &value);
2437 element_name = mi_lttng_element_rotation_schedule_size_threshold;
2438 value_name = mi_lttng_element_rotation_schedule_size_threshold_bytes;
2439 break;
2440 default:
2441 ret = -1;
2442 goto end;
2443 }
2444
2445 if (status != LTTNG_ROTATION_STATUS_OK) {
2446 if (status == LTTNG_ROTATION_STATUS_UNAVAILABLE) {
2447 empty_schedule = true;
2448 } else {
2449 ret = -1;
2450 goto end;
2451 }
2452 }
2453
2454 ret = mi_lttng_writer_open_element(writer, element_name);
2455 if (ret) {
2456 goto end;
2457 }
2458
2459 if (!empty_schedule) {
2460 ret = mi_lttng_writer_write_element_unsigned_int(writer,
2461 value_name, value);
2462 if (ret) {
2463 goto end;
2464 }
2465 }
2466
2467 /* Close schedule descriptor element. */
2468 ret = mi_lttng_writer_close_element(writer);
2469 if (ret) {
2470 goto end;
2471 }
2472 end:
2473 return ret;
2474 }
2475
2476 int mi_lttng_rotation_schedule_result(struct mi_writer *writer,
2477 const struct lttng_rotation_schedule *schedule,
2478 bool success)
2479 {
2480 int ret = 0;
2481
2482 ret = mi_lttng_writer_open_element(writer,
2483 mi_lttng_element_rotation_schedule_result);
2484 if (ret) {
2485 goto end;
2486 }
2487
2488 ret = mi_lttng_writer_open_element(writer,
2489 mi_lttng_element_rotation_schedule);
2490 if (ret) {
2491 goto end;
2492 }
2493
2494 ret = mi_lttng_rotation_schedule(writer, schedule);
2495 if (ret) {
2496 goto end;
2497 }
2498
2499 /* Close rotation_schedule element */
2500 ret = mi_lttng_writer_close_element(writer);
2501 if (ret) {
2502 goto end;
2503 }
2504
2505 ret = mi_lttng_writer_write_element_bool(writer,
2506 mi_lttng_element_command_success, success);
2507 if (ret) {
2508 goto end;
2509 }
2510
2511 /* Close rotation_schedule_result element */
2512 ret = mi_lttng_writer_close_element(writer);
2513 if (ret) {
2514 goto end;
2515 }
2516 end:
2517 return ret;
2518 }
2519
2520 static
2521 int mi_lttng_location(struct mi_writer *writer,
2522 const struct lttng_trace_archive_location *location)
2523 {
2524 int ret = 0;
2525 enum lttng_trace_archive_location_type location_type;
2526 enum lttng_trace_archive_location_status status;
2527
2528 location_type = lttng_trace_archive_location_get_type(location);
2529
2530 switch (location_type) {
2531 case LTTNG_TRACE_ARCHIVE_LOCATION_TYPE_LOCAL:
2532 {
2533 const char *absolute_path;
2534
2535 status = lttng_trace_archive_location_local_get_absolute_path(
2536 location, &absolute_path);
2537 if (status != LTTNG_TRACE_ARCHIVE_LOCATION_STATUS_OK) {
2538 ret = -1;
2539 goto end;
2540 }
2541
2542 ret = mi_lttng_writer_open_element(writer,
2543 mi_lttng_element_rotation_location_local);
2544 if (ret) {
2545 goto end;
2546 }
2547
2548
2549 ret = mi_lttng_writer_write_element_string(writer,
2550 mi_lttng_element_rotation_location_local_absolute_path,
2551 absolute_path);
2552 if (ret) {
2553 goto end;
2554 }
2555
2556 /* Close local element */
2557 ret = mi_lttng_writer_close_element(writer);
2558 if (ret) {
2559 goto end;
2560 }
2561 break;
2562 }
2563 case LTTNG_TRACE_ARCHIVE_LOCATION_TYPE_RELAY:
2564 {
2565 uint16_t control_port, data_port;
2566 const char *host, *relative_path;
2567 enum lttng_trace_archive_location_relay_protocol_type protocol;
2568
2569 /* Fetch all relay location parameters. */
2570 status = lttng_trace_archive_location_relay_get_protocol_type(
2571 location, &protocol);
2572 if (status != LTTNG_TRACE_ARCHIVE_LOCATION_STATUS_OK) {
2573 ret = -1;
2574 goto end;
2575 }
2576
2577 status = lttng_trace_archive_location_relay_get_host(
2578 location, &host);
2579 if (status != LTTNG_TRACE_ARCHIVE_LOCATION_STATUS_OK) {
2580 ret = -1;
2581 goto end;
2582 }
2583
2584 status = lttng_trace_archive_location_relay_get_control_port(
2585 location, &control_port);
2586 if (status != LTTNG_TRACE_ARCHIVE_LOCATION_STATUS_OK) {
2587 ret = -1;
2588 goto end;
2589 }
2590
2591 status = lttng_trace_archive_location_relay_get_data_port(
2592 location, &data_port);
2593 if (status != LTTNG_TRACE_ARCHIVE_LOCATION_STATUS_OK) {
2594 ret = -1;
2595 goto end;
2596 }
2597
2598 status = lttng_trace_archive_location_relay_get_relative_path(
2599 location, &relative_path);
2600 if (status != LTTNG_TRACE_ARCHIVE_LOCATION_STATUS_OK) {
2601 ret = -1;
2602 goto end;
2603 }
2604
2605 ret = mi_lttng_writer_open_element(writer,
2606 mi_lttng_element_rotation_location_relay);
2607 if (ret) {
2608 goto end;
2609 }
2610
2611 ret = mi_lttng_writer_write_element_string(writer,
2612 mi_lttng_element_rotation_location_relay_host,
2613 host);
2614 if (ret) {
2615 goto end;
2616 }
2617
2618 ret = mi_lttng_writer_write_element_unsigned_int(writer,
2619 mi_lttng_element_rotation_location_relay_control_port,
2620 control_port);
2621 if (ret) {
2622 goto end;
2623 }
2624
2625 ret = mi_lttng_writer_write_element_unsigned_int(writer,
2626 mi_lttng_element_rotation_location_relay_data_port,
2627 data_port);
2628 if (ret) {
2629 goto end;
2630 }
2631
2632 ret = mi_lttng_writer_write_element_string(writer,
2633 mi_lttng_element_rotation_location_relay_protocol,
2634 mi_lttng_trace_archive_location_relay_protocol_type_string(protocol));
2635 if (ret) {
2636 goto end;
2637 }
2638
2639 ret = mi_lttng_writer_write_element_string(writer,
2640 mi_lttng_element_rotation_location_relay_relative_path,
2641 relative_path);
2642 if (ret) {
2643 goto end;
2644 }
2645
2646 /* Close relay element */
2647 ret = mi_lttng_writer_close_element(writer);
2648 if (ret) {
2649 goto end;
2650 }
2651 break;
2652 }
2653 default:
2654 abort();
2655 }
2656 end:
2657 return ret;
2658 }
2659
2660 int mi_lttng_rotate(struct mi_writer *writer,
2661 const char *session_name,
2662 enum lttng_rotation_state rotation_state,
2663 const struct lttng_trace_archive_location *location)
2664 {
2665 int ret;
2666
2667 ret = mi_lttng_writer_open_element(writer,
2668 mi_lttng_element_rotation);
2669 if (ret) {
2670 goto end;
2671 }
2672
2673 ret = mi_lttng_writer_write_element_string(writer,
2674 mi_lttng_element_session_name,
2675 session_name);
2676 if (ret) {
2677 goto end;
2678 }
2679
2680 ret = mi_lttng_writer_write_element_string(writer,
2681 mi_lttng_element_rotation_state,
2682 mi_lttng_rotation_state_string(rotation_state));
2683 if (ret) {
2684 goto end;
2685 }
2686
2687 if (!location) {
2688 /* Not a serialization error. */
2689 goto close_rotation;
2690 }
2691
2692 ret = mi_lttng_writer_open_element(writer,
2693 mi_lttng_element_rotation_location);
2694 if (ret) {
2695 goto end;
2696 }
2697
2698 ret = mi_lttng_location(writer, location);
2699 if (ret) {
2700 goto close_location;
2701 }
2702
2703 close_location:
2704 /* Close location element */
2705 ret = mi_lttng_writer_close_element(writer);
2706 if (ret) {
2707 goto end;
2708 }
2709
2710 close_rotation:
2711 /* Close rotation element */
2712 ret = mi_lttng_writer_close_element(writer);
2713 if (ret) {
2714 goto end;
2715 }
2716 end:
2717 return ret;
2718 }
This page took 0.119171 seconds and 4 git commands to generate.