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