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