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