Rename config.h to session-config.h
[lttng-tools.git] / src / common / mi-lttng.c
1 /*
2 * Copyright (C) 2014 - Jonathan Rajotte <jonathan.r.julien@gmail.com>
3 * - Olivier Cotte <olivier.cotte@polymtl.ca>
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License, version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc., 51
16 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17 */
18
19 #define _LGPL_SOURCE
20 #include <common/config/session-config.h>
21 #include <lttng/snapshot-internal.h>
22 #include "mi-lttng.h"
23
24 #include <assert.h>
25
26 /* Strings related to command */
27 const char * const mi_lttng_element_command = "command";
28 const char * const mi_lttng_element_command_action = "snapshot_action";
29 const char * const mi_lttng_element_command_add_context = "add-context";
30 const char * const mi_lttng_element_command_calibrate = "calibrate";
31 const char * const mi_lttng_element_command_create = "create";
32 const char * const mi_lttng_element_command_destroy = "destroy";
33 const char * const mi_lttng_element_command_disable_channel = "disable-channel";
34 const char * const mi_lttng_element_command_disable_event = "disable-event";
35 const char * const mi_lttng_element_command_enable_channels = "enable-channel";
36 const char * const mi_lttng_element_command_enable_event = "enable-event";
37 const char * const mi_lttng_element_command_list = "list";
38 const char * const mi_lttng_element_command_load = "load";
39 const char * const mi_lttng_element_command_name = "name";
40 const char * const mi_lttng_element_command_output = "output";
41 const char * const mi_lttng_element_command_save = "save";
42 const char * const mi_lttng_element_command_set_session = "set-session";
43 const char * const mi_lttng_element_command_snapshot = "snapshot";
44 const char * const mi_lttng_element_command_snapshot_add = "add_snapshot";
45 const char * const mi_lttng_element_command_snapshot_del = "del_snapshot";
46 const char * const mi_lttng_element_command_snapshot_list = "list_snapshot";
47 const char * const mi_lttng_element_command_snapshot_record = "record_snapshot";
48 const char * const mi_lttng_element_command_start = "start";
49 const char * const mi_lttng_element_command_stop = "stop";
50 const char * const mi_lttng_element_command_success = "success";
51 const char * const mi_lttng_element_command_track = "track";
52 const char * const mi_lttng_element_command_untrack = "untrack";
53 const char * const mi_lttng_element_command_version = "version";
54
55 /* Strings related to version command */
56 const char * const mi_lttng_element_version = "version";
57 const char * const mi_lttng_element_version_commit = "commit";
58 const char * const mi_lttng_element_version_description = "description";
59 const char * const mi_lttng_element_version_license = "license";
60 const char * const mi_lttng_element_version_major = "major";
61 const char * const mi_lttng_element_version_minor = "minor";
62 const char * const mi_lttng_element_version_patch_level = "patchLevel";
63 const char * const mi_lttng_element_version_str = "string";
64 const char * const mi_lttng_element_version_web = "url";
65
66 /* String related to a lttng_event_field */
67 const char * const mi_lttng_element_event_field = "event_field";
68 const char * const mi_lttng_element_event_fields = "event_fields";
69
70 /* String related to lttng_event_context */
71 const char * const mi_lttng_context_type_perf_counter = "PERF_COUNTER";
72 const char * const mi_lttng_context_type_perf_cpu_counter = "PERF_CPU_COUNTER";
73 const char * const mi_lttng_context_type_perf_thread_counter = "PERF_THREAD_COUNTER";
74
75 /* String related to lttng_event_perf_counter_ctx */
76 const char * const mi_lttng_element_perf_counter_context = "perf_counter_context";
77
78 /* Strings related to pid */
79 const char * const mi_lttng_element_pid_id = "id";
80
81 /* Strings related to save command */
82 const char * const mi_lttng_element_save = "save";
83
84 /* Strings related to load command */
85 const char * const mi_lttng_element_load = "load";
86
87 /* General elements of mi_lttng */
88 const char * const mi_lttng_element_empty = "";
89 const char * const mi_lttng_element_id = "id";
90 const char * const mi_lttng_element_nowrite = "nowrite";
91 const char * const mi_lttng_element_success = "success";
92 const char * const mi_lttng_element_type_enum = "ENUM";
93 const char * const mi_lttng_element_type_float = "FLOAT";
94 const char * const mi_lttng_element_type_integer = "INTEGER";
95 const char * const mi_lttng_element_type_other = "OTHER";
96 const char * const mi_lttng_element_type_string = "STRING";
97
98 /* String related to loglevel */
99 const char * const mi_lttng_loglevel_str_alert = "TRACE_ALERT";
100 const char * const mi_lttng_loglevel_str_crit = "TRACE_CRIT";
101 const char * const mi_lttng_loglevel_str_debug = "TRACE_DEBUG";
102 const char * const mi_lttng_loglevel_str_debug_function = "TRACE_DEBUG_FUNCTION";
103 const char * const mi_lttng_loglevel_str_debug_line = "TRACE_DEBUG_LINE";
104 const char * const mi_lttng_loglevel_str_debug_module = "TRACE_DEBUG_MODULE";
105 const char * const mi_lttng_loglevel_str_debug_process = "TRACE_DEBUG_PROCESS";
106 const char * const mi_lttng_loglevel_str_debug_program = "TRACE_DEBUG_PROGRAM";
107 const char * const mi_lttng_loglevel_str_debug_system = "TRACE_DEBUG_SYSTEM";
108 const char * const mi_lttng_loglevel_str_debug_unit = "TRACE_DEBUG_UNIT";
109 const char * const mi_lttng_loglevel_str_emerg = "TRACE_EMERG";
110 const char * const mi_lttng_loglevel_str_err = "TRACE_ERR";
111 const char * const mi_lttng_loglevel_str_info = "TRACE_INFO";
112 const char * const mi_lttng_loglevel_str_notice = "TRACE_NOTICE";
113 const char * const mi_lttng_loglevel_str_unknown = "UNKNOWN";
114 const char * const mi_lttng_loglevel_str_warning = "TRACE_WARNING";
115
116 /* String related to loglevel JUL */
117 const char * const mi_lttng_loglevel_str_jul_all = "JUL_ALL";
118 const char * const mi_lttng_loglevel_str_jul_config = "JUL_CONFIG";
119 const char * const mi_lttng_loglevel_str_jul_fine = "JUL_FINE";
120 const char * const mi_lttng_loglevel_str_jul_finer = "JUL_FINER";
121 const char * const mi_lttng_loglevel_str_jul_finest = "JUL_FINEST";
122 const char * const mi_lttng_loglevel_str_jul_info = "JUL_INFO";
123 const char * const mi_lttng_loglevel_str_jul_off = "JUL_OFF";
124 const char * const mi_lttng_loglevel_str_jul_severe = "JUL_SEVERE";
125 const char * const mi_lttng_loglevel_str_jul_warning = "JUL_WARNING";
126
127 /* String related to loglevel LOG4J */
128 const char * const mi_lttng_loglevel_str_log4j_off = "LOG4J_OFF";
129 const char * const mi_lttng_loglevel_str_log4j_fatal = "LOG4J_FATAL";
130 const char * const mi_lttng_loglevel_str_log4j_error = "LOG4J_ERROR";
131 const char * const mi_lttng_loglevel_str_log4j_warn = "LOG4J_WARN";
132 const char * const mi_lttng_loglevel_str_log4j_info = "LOG4J_INFO";
133 const char * const mi_lttng_loglevel_str_log4j_debug = "LOG4J_DEBUG";
134 const char * const mi_lttng_loglevel_str_log4j_trace = "LOG4J_TRACE";
135 const char * const mi_lttng_loglevel_str_log4j_all = "LOG4J_ALL";
136
137 /* String related to loglevel Python */
138 const char * const mi_lttng_loglevel_str_python_critical = "PYTHON_CRITICAL";
139 const char * const mi_lttng_loglevel_str_python_error = "PYTHON_ERROR";
140 const char * const mi_lttng_loglevel_str_python_warning = "PYTHON_WARNING";
141 const char * const mi_lttng_loglevel_str_python_info = "PYTHON_INFO";
142 const char * const mi_lttng_loglevel_str_python_debug = "PYTHON_DEBUG";
143 const char * const mi_lttng_loglevel_str_python_notset = "PYTHON_NOTSET";
144
145 /* String related to loglevel type */
146 const char * const mi_lttng_loglevel_type_all = "ALL";
147 const char * const mi_lttng_loglevel_type_range = "RANGE";
148 const char * const mi_lttng_loglevel_type_single = "SINGLE";
149 const char * const mi_lttng_loglevel_type_unknown = "UNKNOWN";
150
151 /* String related to lttng_calibrate */
152 const char * const mi_lttng_element_calibrate = "calibrate";
153 const char * const mi_lttng_element_calibrate_function = "FUNCTION";
154
155 /* String related to a lttng_snapshot_output */
156 const char * const mi_lttng_element_snapshot_ctrl_url = "ctrl_url";
157 const char * const mi_lttng_element_snapshot_data_url = "data_url";
158 const char * const mi_lttng_element_snapshot_max_size = "max_size";
159 const char * const mi_lttng_element_snapshot_n_ptr = "n_ptr";
160 const char * const mi_lttng_element_snapshot_session_name = "session_name";
161 const char * const mi_lttng_element_snapshots = "snapshots";
162
163 /* String related to track/untrack command */
164 const char * const mi_lttng_element_track_untrack_all_wildcard = "*";
165
166
167 /* This is a merge of jul loglevel and regular loglevel
168 * Those should never overlap by definition
169 * (see struct lttng_event loglevel)
170 */
171 LTTNG_HIDDEN
172 const char *mi_lttng_loglevel_string(int value, enum lttng_domain_type domain)
173 {
174 switch (domain) {
175 case LTTNG_DOMAIN_KERNEL:
176 case LTTNG_DOMAIN_UST:
177 switch (value) {
178 case -1:
179 return mi_lttng_element_empty;
180 case LTTNG_LOGLEVEL_EMERG:
181 return mi_lttng_loglevel_str_emerg;
182 case LTTNG_LOGLEVEL_ALERT:
183 return mi_lttng_loglevel_str_alert;
184 case LTTNG_LOGLEVEL_CRIT:
185 return mi_lttng_loglevel_str_crit;
186 case LTTNG_LOGLEVEL_ERR:
187 return mi_lttng_loglevel_str_err;
188 case LTTNG_LOGLEVEL_WARNING:
189 return mi_lttng_loglevel_str_warning;
190 case LTTNG_LOGLEVEL_NOTICE:
191 return mi_lttng_loglevel_str_notice;
192 case LTTNG_LOGLEVEL_INFO:
193 return mi_lttng_loglevel_str_info;
194 case LTTNG_LOGLEVEL_DEBUG_SYSTEM:
195 return mi_lttng_loglevel_str_debug_system;
196 case LTTNG_LOGLEVEL_DEBUG_PROGRAM:
197 return mi_lttng_loglevel_str_debug_program;
198 case LTTNG_LOGLEVEL_DEBUG_PROCESS:
199 return mi_lttng_loglevel_str_debug_process;
200 case LTTNG_LOGLEVEL_DEBUG_MODULE:
201 return mi_lttng_loglevel_str_debug_module;
202 case LTTNG_LOGLEVEL_DEBUG_UNIT:
203 return mi_lttng_loglevel_str_debug_unit;
204 case LTTNG_LOGLEVEL_DEBUG_FUNCTION:
205 return mi_lttng_loglevel_str_debug_function;
206 case LTTNG_LOGLEVEL_DEBUG_LINE:
207 return mi_lttng_loglevel_str_debug_line;
208 case LTTNG_LOGLEVEL_DEBUG:
209 return mi_lttng_loglevel_str_debug;
210 default:
211 return mi_lttng_loglevel_str_unknown;
212 }
213 break;
214 case LTTNG_DOMAIN_LOG4J:
215 switch (value) {
216 case -1:
217 return mi_lttng_element_empty;
218 case LTTNG_LOGLEVEL_LOG4J_OFF:
219 return mi_lttng_loglevel_str_log4j_off;
220 case LTTNG_LOGLEVEL_LOG4J_FATAL:
221 return mi_lttng_loglevel_str_log4j_fatal;
222 case LTTNG_LOGLEVEL_LOG4J_ERROR:
223 return mi_lttng_loglevel_str_log4j_error;
224 case LTTNG_LOGLEVEL_LOG4J_WARN:
225 return mi_lttng_loglevel_str_log4j_warn;
226 case LTTNG_LOGLEVEL_LOG4J_INFO:
227 return mi_lttng_loglevel_str_log4j_info;
228 case LTTNG_LOGLEVEL_LOG4J_DEBUG:
229 return mi_lttng_loglevel_str_log4j_debug;
230 case LTTNG_LOGLEVEL_LOG4J_TRACE:
231 return mi_lttng_loglevel_str_log4j_trace;
232 case LTTNG_LOGLEVEL_LOG4J_ALL:
233 return mi_lttng_loglevel_str_log4j_all;
234 default:
235 return mi_lttng_loglevel_str_unknown;
236 }
237 break;
238 case LTTNG_DOMAIN_JUL:
239 switch (value) {
240 case -1:
241 return mi_lttng_element_empty;
242 case LTTNG_LOGLEVEL_JUL_OFF:
243 return mi_lttng_loglevel_str_jul_off;
244 case LTTNG_LOGLEVEL_JUL_SEVERE:
245 return mi_lttng_loglevel_str_jul_severe;
246 case LTTNG_LOGLEVEL_JUL_WARNING:
247 return mi_lttng_loglevel_str_jul_warning;
248 case LTTNG_LOGLEVEL_JUL_INFO:
249 return mi_lttng_loglevel_str_jul_info;
250 case LTTNG_LOGLEVEL_JUL_CONFIG:
251 return mi_lttng_loglevel_str_jul_config;
252 case LTTNG_LOGLEVEL_JUL_FINE:
253 return mi_lttng_loglevel_str_jul_fine;
254 case LTTNG_LOGLEVEL_JUL_FINER:
255 return mi_lttng_loglevel_str_jul_finer;
256 case LTTNG_LOGLEVEL_JUL_FINEST:
257 return mi_lttng_loglevel_str_jul_finest;
258 case LTTNG_LOGLEVEL_JUL_ALL:
259 return mi_lttng_loglevel_str_jul_all;
260 default:
261 return mi_lttng_loglevel_str_unknown;
262 }
263 break;
264 case LTTNG_DOMAIN_PYTHON:
265 switch (value) {
266 case LTTNG_LOGLEVEL_PYTHON_CRITICAL:
267 return mi_lttng_loglevel_str_python_critical;
268 case LTTNG_LOGLEVEL_PYTHON_ERROR:
269 return mi_lttng_loglevel_str_python_error;
270 case LTTNG_LOGLEVEL_PYTHON_WARNING:
271 return mi_lttng_loglevel_str_python_warning;
272 case LTTNG_LOGLEVEL_PYTHON_INFO:
273 return mi_lttng_loglevel_str_python_info;
274 case LTTNG_LOGLEVEL_PYTHON_DEBUG:
275 return mi_lttng_loglevel_str_python_debug;
276 case LTTNG_LOGLEVEL_PYTHON_NOTSET:
277 return mi_lttng_loglevel_str_python_notset;
278 default:
279 return mi_lttng_loglevel_str_unknown;
280 }
281 break;
282 }
283
284 /* Reaching this means the domain is unknown. */
285 return mi_lttng_loglevel_str_unknown;
286 }
287
288 LTTNG_HIDDEN
289 const char *mi_lttng_logleveltype_string(enum lttng_loglevel_type value)
290 {
291 switch (value) {
292 case LTTNG_EVENT_LOGLEVEL_ALL:
293 return mi_lttng_loglevel_type_all;
294 case LTTNG_EVENT_LOGLEVEL_RANGE:
295 return mi_lttng_loglevel_type_range;
296 case LTTNG_EVENT_LOGLEVEL_SINGLE:
297 return mi_lttng_loglevel_type_single;
298 default:
299 return mi_lttng_loglevel_type_unknown;
300 }
301 }
302
303 LTTNG_HIDDEN
304 const char *mi_lttng_eventtype_string(enum lttng_event_type value)
305 {
306 switch (value) {
307 case LTTNG_EVENT_ALL:
308 return config_event_type_all;
309 case LTTNG_EVENT_TRACEPOINT:
310 return config_event_type_tracepoint;
311 case LTTNG_EVENT_PROBE:
312 return config_event_type_probe;
313 case LTTNG_EVENT_FUNCTION:
314 return config_event_type_function;
315 case LTTNG_EVENT_FUNCTION_ENTRY:
316 return config_event_type_function_entry;
317 case LTTNG_EVENT_SYSCALL:
318 return config_event_type_syscall;
319 case LTTNG_EVENT_NOOP:
320 return config_event_type_noop;
321 default:
322 return mi_lttng_element_empty;
323 }
324 }
325
326 LTTNG_HIDDEN
327 const char *mi_lttng_event_contexttype_string(enum lttng_event_context_type val)
328 {
329 switch (val) {
330 case LTTNG_EVENT_CONTEXT_PID:
331 return config_event_context_pid;
332 case LTTNG_EVENT_CONTEXT_PERF_COUNTER:
333 return mi_lttng_context_type_perf_counter;
334 case LTTNG_EVENT_CONTEXT_PERF_THREAD_COUNTER:
335 return mi_lttng_context_type_perf_thread_counter;
336 case LTTNG_EVENT_CONTEXT_PERF_CPU_COUNTER:
337 return mi_lttng_context_type_perf_cpu_counter;
338 case LTTNG_EVENT_CONTEXT_PROCNAME:
339 return config_event_context_procname;
340 case LTTNG_EVENT_CONTEXT_PRIO:
341 return config_event_context_prio;
342 case LTTNG_EVENT_CONTEXT_NICE:
343 return config_event_context_nice;
344 case LTTNG_EVENT_CONTEXT_VPID:
345 return config_event_context_vpid;
346 case LTTNG_EVENT_CONTEXT_TID:
347 return config_event_context_tid;
348 case LTTNG_EVENT_CONTEXT_VTID:
349 return config_event_context_vtid;
350 case LTTNG_EVENT_CONTEXT_PPID:
351 return config_event_context_ppid;
352 case LTTNG_EVENT_CONTEXT_VPPID:
353 return config_event_context_vppid;
354 case LTTNG_EVENT_CONTEXT_PTHREAD_ID:
355 return config_event_context_pthread_id;
356 case LTTNG_EVENT_CONTEXT_HOSTNAME:
357 return config_event_context_hostname;
358 case LTTNG_EVENT_CONTEXT_IP:
359 return config_event_context_ip;
360 default:
361 return NULL;
362 }
363 }
364
365 LTTNG_HIDDEN
366 const char *mi_lttng_eventfieldtype_string(enum lttng_event_field_type val)
367 {
368 switch (val) {
369 case(LTTNG_EVENT_FIELD_INTEGER):
370 return mi_lttng_element_type_integer;
371 case(LTTNG_EVENT_FIELD_ENUM):
372 return mi_lttng_element_type_enum;
373 case(LTTNG_EVENT_FIELD_FLOAT):
374 return mi_lttng_element_type_float;
375 case(LTTNG_EVENT_FIELD_STRING):
376 return mi_lttng_element_type_string;
377 default:
378 return mi_lttng_element_type_other;
379 }
380 }
381
382 LTTNG_HIDDEN
383 const char *mi_lttng_domaintype_string(enum lttng_domain_type value)
384 {
385 /* Note: This is a *duplicate* of get_domain_str from bin/lttng/utils.c */
386 switch (value) {
387 case LTTNG_DOMAIN_KERNEL:
388 return config_domain_type_kernel;
389 case LTTNG_DOMAIN_UST:
390 return config_domain_type_ust;
391 case LTTNG_DOMAIN_JUL:
392 return config_domain_type_jul;
393 case LTTNG_DOMAIN_LOG4J:
394 return config_domain_type_log4j;
395 case LTTNG_DOMAIN_PYTHON:
396 return config_domain_type_python;
397 default:
398 /* Should not have an unknown domain */
399 assert(0);
400 }
401 }
402
403 LTTNG_HIDDEN
404 const char *mi_lttng_buffertype_string(enum lttng_buffer_type value)
405 {
406 switch (value) {
407 case LTTNG_BUFFER_PER_PID:
408 return config_buffer_type_per_pid;
409 case LTTNG_BUFFER_PER_UID:
410 return config_buffer_type_per_uid;
411 case LTTNG_BUFFER_GLOBAL:
412 return config_buffer_type_global;
413 default:
414 /* Should not have an unknow buffer type */
415 assert(0);
416 }
417 }
418
419 LTTNG_HIDDEN
420 const char *mi_lttng_calibratetype_string(enum lttng_calibrate_type val)
421 {
422 const char *ret;
423
424 switch (val) {
425 case LTTNG_CALIBRATE_FUNCTION:
426 ret = mi_lttng_element_calibrate_function;
427 break;
428 default:
429 ret = mi_lttng_element_empty;
430 break;
431 }
432 return ret;
433 }
434
435 LTTNG_HIDDEN
436 struct mi_writer *mi_lttng_writer_create(int fd_output, int mi_output_type)
437 {
438 struct mi_writer *mi_writer;
439
440 mi_writer = zmalloc(sizeof(struct mi_writer));
441 if (!mi_writer) {
442 PERROR("zmalloc mi_writer_create");
443 goto end;
444 }
445 if (mi_output_type == LTTNG_MI_XML) {
446 mi_writer->writer = config_writer_create(fd_output, 0);
447 if (!mi_writer->writer) {
448 goto err_destroy;
449 }
450 mi_writer->type = LTTNG_MI_XML;
451 } else {
452 goto err_destroy;
453 }
454
455 end:
456 return mi_writer;
457
458 err_destroy:
459 free(mi_writer);
460 return NULL;
461 }
462
463 LTTNG_HIDDEN
464 int mi_lttng_writer_destroy(struct mi_writer *writer)
465 {
466 int ret;
467
468 if (!writer) {
469 ret = -EINVAL;
470 goto end;
471 }
472
473 ret = config_writer_destroy(writer->writer);
474 if (ret < 0) {
475 goto end;
476 }
477
478 free(writer);
479 end:
480 return ret;
481 }
482
483 LTTNG_HIDDEN
484 int mi_lttng_writer_command_open(struct mi_writer *writer, const char *command)
485 {
486 int ret;
487
488 ret = mi_lttng_writer_open_element(writer, mi_lttng_element_command);
489 if (ret) {
490 goto end;
491 }
492 ret = mi_lttng_writer_write_element_string(writer,
493 mi_lttng_element_command_name, command);
494 end:
495 return ret;
496 }
497
498 LTTNG_HIDDEN
499 int mi_lttng_writer_command_close(struct mi_writer *writer)
500 {
501 return mi_lttng_writer_close_element(writer);
502 }
503
504 LTTNG_HIDDEN
505 int mi_lttng_writer_open_element(struct mi_writer *writer,
506 const char *element_name)
507 {
508 return config_writer_open_element(writer->writer, element_name);
509 }
510
511 LTTNG_HIDDEN
512 int mi_lttng_writer_close_element(struct mi_writer *writer)
513 {
514 return config_writer_close_element(writer->writer);
515 }
516
517 LTTNG_HIDDEN
518 int mi_lttng_close_multi_element(struct mi_writer *writer,
519 unsigned int nb_element)
520 {
521 int ret, i;
522
523 if (nb_element < 1) {
524 ret = 0;
525 goto end;
526 }
527 for (i = 0; i < nb_element; i++) {
528 ret = mi_lttng_writer_close_element(writer);
529 if (ret) {
530 goto end;
531 }
532 }
533 end:
534 return ret;
535 }
536
537 LTTNG_HIDDEN
538 int mi_lttng_writer_write_element_unsigned_int(struct mi_writer *writer,
539 const char *element_name, uint64_t value)
540 {
541 return config_writer_write_element_unsigned_int(writer->writer,
542 element_name, value);
543 }
544
545 LTTNG_HIDDEN
546 int mi_lttng_writer_write_element_signed_int(struct mi_writer *writer,
547 const char *element_name, int64_t value)
548 {
549 return config_writer_write_element_signed_int(writer->writer,
550 element_name, value);
551 }
552
553 LTTNG_HIDDEN
554 int mi_lttng_writer_write_element_bool(struct mi_writer *writer,
555 const char *element_name, int value)
556 {
557 return config_writer_write_element_bool(writer->writer,
558 element_name, value);
559 }
560
561 LTTNG_HIDDEN
562 int mi_lttng_writer_write_element_string(struct mi_writer *writer,
563 const char *element_name, const char *value)
564 {
565 return config_writer_write_element_string(writer->writer,
566 element_name, value);
567 }
568
569 LTTNG_HIDDEN
570 int mi_lttng_version(struct mi_writer *writer, struct mi_lttng_version *version,
571 const char *lttng_description, const char *lttng_license)
572 {
573 int ret;
574
575 /* Open version */
576 ret = mi_lttng_writer_open_element(writer, mi_lttng_element_version);
577 if (ret) {
578 goto end;
579 }
580
581 /* Version string (contain info like rc etc.) */
582 ret = mi_lttng_writer_write_element_string(writer,
583 mi_lttng_element_version_str, version->version);
584 if (ret) {
585 goto end;
586 }
587
588 /* Major version number */
589 ret = mi_lttng_writer_write_element_unsigned_int(writer,
590 mi_lttng_element_version_major, version->version_major);
591 if (ret) {
592 goto end;
593 }
594
595 /* Minor version number */
596 ret = mi_lttng_writer_write_element_unsigned_int(writer,
597 mi_lttng_element_version_minor, version->version_minor);
598 if (ret) {
599 goto end;
600 }
601
602 /* Commit version number */
603 ret = mi_lttng_writer_write_element_string(writer,
604 mi_lttng_element_version_commit, version->version_commit);
605 if (ret) {
606 goto end;
607 }
608
609 /* Patch number */
610 ret = mi_lttng_writer_write_element_unsigned_int(writer,
611 mi_lttng_element_version_patch_level, version->version_patchlevel);
612 if (ret) {
613 goto end;
614 }
615
616 /* Name of the version */
617 ret = mi_lttng_writer_write_element_string(writer,
618 config_element_name, version->version_name);
619 if (ret) {
620 goto end;
621 }
622
623 /* Description mostly related to beer... */
624 ret = mi_lttng_writer_write_element_string(writer,
625 mi_lttng_element_version_description, lttng_description);
626 if (ret) {
627 goto end;
628 }
629
630 /* url */
631 ret = mi_lttng_writer_write_element_string(writer,
632 mi_lttng_element_version_web, version->package_url);
633 if (ret) {
634 goto end;
635 }
636
637 /* License: free as in free beer...no...*speech* */
638 ret = mi_lttng_writer_write_element_string(writer,
639 mi_lttng_element_version_license, lttng_license);
640 if (ret) {
641 goto end;
642 }
643
644 /* Close version element */
645 ret = mi_lttng_writer_close_element(writer);
646
647 end:
648 return ret;
649 }
650
651 LTTNG_HIDDEN
652 int mi_lttng_sessions_open(struct mi_writer *writer)
653 {
654 return mi_lttng_writer_open_element(writer, config_element_sessions);
655 }
656
657 LTTNG_HIDDEN
658 int mi_lttng_session(struct mi_writer *writer,
659 struct lttng_session *session, int is_open)
660 {
661 int ret;
662
663 assert(session);
664
665 /* Open sessions element */
666 ret = mi_lttng_writer_open_element(writer,
667 config_element_session);
668 if (ret) {
669 goto end;
670 }
671
672 /* Name of the session */
673 ret = mi_lttng_writer_write_element_string(writer,
674 config_element_name, session->name);
675 if (ret) {
676 goto end;
677 }
678
679 /* Path */
680 ret = mi_lttng_writer_write_element_string(writer,
681 config_element_path, session->path);
682 if (ret) {
683 goto end;
684 }
685
686 /* Enabled ? */
687 ret = mi_lttng_writer_write_element_bool(writer,
688 config_element_enabled, session->enabled);
689 if (ret) {
690 goto end;
691 }
692
693 /* Snapshot mode */
694 ret = mi_lttng_writer_write_element_unsigned_int(writer,
695 config_element_snapshot_mode, session->snapshot_mode);
696 if (ret) {
697 goto end;
698 }
699
700 /* Live timer interval in usec */
701 ret = mi_lttng_writer_write_element_unsigned_int(writer,
702 config_element_live_timer_interval,
703 session->live_timer_interval);
704 if (ret) {
705 goto end;
706 }
707
708 if (!is_open) {
709 /* Closing session element */
710 ret = mi_lttng_writer_close_element(writer);
711 }
712 end:
713 return ret;
714
715 }
716
717 LTTNG_HIDDEN
718 int mi_lttng_domains_open(struct mi_writer *writer)
719 {
720 return mi_lttng_writer_open_element(writer, config_element_domains);
721 }
722
723 LTTNG_HIDDEN
724 int mi_lttng_domain(struct mi_writer *writer,
725 struct lttng_domain *domain, int is_open)
726 {
727 int ret = 0;
728 const char *str_domain;
729 const char *str_buffer;
730
731 assert(domain);
732
733 /* Open domain element */
734 ret = mi_lttng_writer_open_element(writer, config_element_domain);
735 if (ret) {
736 goto end;
737 }
738
739 /* Domain Type */
740 str_domain = mi_lttng_domaintype_string(domain->type);
741 ret = mi_lttng_writer_write_element_string(writer, config_element_type,
742 str_domain);
743 if (ret) {
744 goto end;
745 }
746
747 /* Buffer Type */
748 str_buffer= mi_lttng_buffertype_string(domain->buf_type);
749 ret = mi_lttng_writer_write_element_string(writer,
750 config_element_buffer_type, str_buffer);
751 if (ret) {
752 goto end;
753 }
754
755 /* TODO: union attr
756 * This union is not currently used and was added for
757 * future ust domain support.
758 * Date: 25-06-2014
759 * */
760
761 if (!is_open) {
762 /* Closing domain element */
763 ret = mi_lttng_writer_close_element(writer);
764 }
765
766 end:
767 return ret;
768
769 }
770
771 LTTNG_HIDDEN
772 int mi_lttng_channels_open(struct mi_writer *writer)
773 {
774 return mi_lttng_writer_open_element(writer, config_element_channels);
775 }
776
777 LTTNG_HIDDEN
778 int mi_lttng_channel(struct mi_writer *writer,
779 struct lttng_channel *channel, int is_open)
780 {
781 int ret = 0;
782
783 assert(channel);
784
785 /* Opening channel element */
786 ret = mi_lttng_writer_open_element(writer, config_element_channel);
787 if (ret) {
788 goto end;
789 }
790
791 /* Name */
792 ret = mi_lttng_writer_write_element_string(writer, config_element_name,
793 channel->name);
794 if (ret) {
795 goto end;
796 }
797
798 /* Enabled ? */
799 ret = mi_lttng_writer_write_element_bool(writer,
800 config_element_enabled, channel->enabled);
801 if (ret) {
802 goto end;
803 }
804
805 /* Attribute */
806 ret = mi_lttng_channel_attr(writer, &channel->attr);
807 if (ret) {
808 goto end;
809 }
810
811 if (!is_open) {
812 /* Closing channel element */
813 ret = mi_lttng_writer_close_element(writer);
814 if (ret) {
815 goto end;
816 }
817 }
818 end:
819 return ret;
820 }
821
822 LTTNG_HIDDEN
823 int mi_lttng_channel_attr(struct mi_writer *writer,
824 struct lttng_channel_attr *attr)
825 {
826 int ret = 0;
827
828 assert(attr);
829
830 /* Opening Attributes */
831 ret = mi_lttng_writer_open_element(writer, config_element_attributes);
832 if (ret) {
833 goto end;
834 }
835
836 /* Overwrite */
837 ret = mi_lttng_writer_write_element_string(writer,
838 config_element_overwrite_mode,
839 attr->overwrite ? config_overwrite_mode_overwrite :
840 config_overwrite_mode_discard);
841 if (ret) {
842 goto end;
843 }
844
845 /* Sub buffer size in byte */
846 ret = mi_lttng_writer_write_element_unsigned_int(writer,
847 config_element_subbuf_size, attr->subbuf_size);
848 if (ret) {
849 goto end;
850 }
851
852 /* Number of subbuffer (power of two) */
853 ret = mi_lttng_writer_write_element_unsigned_int(writer,
854 config_element_num_subbuf,
855 attr->num_subbuf);
856 if (ret) {
857 goto end;
858 }
859
860 /* Switch timer interval in usec */
861 ret = mi_lttng_writer_write_element_unsigned_int(writer,
862 config_element_switch_timer_interval,
863 attr->switch_timer_interval);
864 if (ret) {
865 goto end;
866 }
867
868 /* Read timer interval in usec */
869 ret = mi_lttng_writer_write_element_unsigned_int(writer,
870 config_element_read_timer_interval,
871 attr->read_timer_interval);
872 if (ret) {
873 goto end;
874 }
875
876 /* Event output */
877 ret = mi_lttng_writer_write_element_string(writer,
878 config_element_output_type,
879 attr->output == LTTNG_EVENT_SPLICE ?
880 config_output_type_splice : config_output_type_mmap);
881 if (ret) {
882 goto end;
883 }
884
885 /* Tracefile size in bytes */
886 ret = mi_lttng_writer_write_element_unsigned_int(writer,
887 config_element_tracefile_size, attr->tracefile_size);
888 if (ret) {
889 goto end;
890 }
891
892 /* Count of tracefiles */
893 ret = mi_lttng_writer_write_element_unsigned_int(writer,
894 config_element_tracefile_count,
895 attr->tracefile_count);
896 if (ret) {
897 goto end;
898 }
899
900 /* Live timer interval in usec*/
901 ret = mi_lttng_writer_write_element_unsigned_int(writer,
902 config_element_live_timer_interval,
903 attr->live_timer_interval);
904 if (ret) {
905 goto end;
906 }
907
908 /* Closing attributes */
909 ret = mi_lttng_writer_close_element(writer);
910 if (ret) {
911 goto end;
912 }
913 end:
914 return ret;
915
916 }
917
918 LTTNG_HIDDEN
919 int mi_lttng_event_common_attributes(struct mi_writer *writer,
920 struct lttng_event *event)
921 {
922 int ret;
923
924 /* Open event element */
925 ret = mi_lttng_writer_open_element(writer, config_element_event);
926 if (ret) {
927 goto end;
928 }
929
930 /* Event name */
931 ret = mi_lttng_writer_write_element_string(writer,
932 config_element_name, event->name);
933 if (ret) {
934 goto end;
935 }
936
937 /* Event type */
938 ret = mi_lttng_writer_write_element_string(writer,
939 config_element_type, mi_lttng_eventtype_string(event->type));
940 if (ret) {
941 goto end;
942 }
943
944 /* Is event enabled */
945 ret = mi_lttng_writer_write_element_bool(writer,
946 config_element_enabled, event->enabled);
947 if (ret) {
948 goto end;
949 }
950
951 /* Event filter enabled? */
952 ret = mi_lttng_writer_write_element_bool(writer,
953 config_element_filter, event->filter);
954
955 end:
956 return ret;
957 }
958
959 LTTNG_HIDDEN
960 int mi_lttng_event_tracepoint_loglevel(struct mi_writer *writer,
961 struct lttng_event *event, enum lttng_domain_type domain)
962 {
963 int ret;
964
965 /* Event loglevel */
966 ret = mi_lttng_writer_write_element_string(writer,
967 config_element_loglevel,
968 mi_lttng_loglevel_string(event->loglevel, domain));
969 if (ret) {
970 goto end;
971 }
972
973 /* Log level type */
974 ret = mi_lttng_writer_write_element_string(writer,
975 config_element_loglevel_type,
976 mi_lttng_logleveltype_string(event->loglevel_type));
977 if (ret) {
978 goto end;
979 }
980
981 /* event exclusion filter */
982 ret = mi_lttng_writer_write_element_bool(writer,
983 config_element_exclusion, event->exclusion);
984 if (ret) {
985 goto end;
986 }
987
988 end:
989 return ret;
990 }
991
992 LTTNG_HIDDEN
993 int mi_lttng_event_tracepoint_no_loglevel(struct mi_writer *writer,
994 struct lttng_event *event)
995 {
996 /* event exclusion filter */
997 return mi_lttng_writer_write_element_bool(writer,
998 config_element_exclusion, event->exclusion);
999 }
1000
1001 LTTNG_HIDDEN
1002 int mi_lttng_event_function_probe(struct mi_writer *writer,
1003 struct lttng_event *event)
1004 {
1005 int ret;
1006
1007 ret = mi_lttng_writer_open_element(writer, config_element_attributes);
1008 if (ret) {
1009 goto end;
1010 }
1011
1012 ret = mi_lttng_writer_open_element(writer, config_element_probe_attributes);
1013 if (ret) {
1014 goto end;
1015 }
1016
1017 if (event->attr.probe.addr != 0) {
1018 /* event probe address */
1019 ret = mi_lttng_writer_write_element_unsigned_int(writer,
1020 config_element_address, event->attr.probe.addr);
1021 if (ret) {
1022 goto end;
1023 }
1024 } else {
1025 /* event probe offset */
1026 ret = mi_lttng_writer_write_element_unsigned_int(writer,
1027 config_element_offset, event->attr.probe.offset);
1028 if (ret) {
1029 goto end;
1030 }
1031
1032 /* event probe symbol_name */
1033 ret = mi_lttng_writer_write_element_string(writer,
1034 config_element_symbol_name, event->attr.probe.symbol_name);
1035 if (ret) {
1036 goto end;
1037 }
1038 }
1039
1040 /* Close probe_attributes and attributes */
1041 ret = mi_lttng_close_multi_element(writer, 2);
1042 end:
1043 return ret;
1044 }
1045
1046 LTTNG_HIDDEN
1047 int mi_lttng_event_function_entry(struct mi_writer *writer,
1048 struct lttng_event *event)
1049 {
1050 int ret;
1051
1052 ret = mi_lttng_writer_open_element(writer, config_element_attributes);
1053 if (ret) {
1054 goto end;
1055 }
1056
1057 ret = mi_lttng_writer_open_element(writer, config_element_probe_attributes);
1058 if (ret) {
1059 goto end;
1060 }
1061
1062 /* event probe symbol_name */
1063 ret = mi_lttng_writer_write_element_string(writer,
1064 config_element_symbol_name, event->attr.ftrace.symbol_name);
1065 if (ret) {
1066 goto end;
1067 }
1068
1069 /* Close function_attributes and attributes */
1070 ret = mi_lttng_close_multi_element(writer, 2);
1071 end:
1072 return ret;
1073 }
1074
1075 LTTNG_HIDDEN
1076 int mi_lttng_events_open(struct mi_writer *writer)
1077 {
1078 return mi_lttng_writer_open_element(writer, config_element_events);
1079 }
1080
1081 LTTNG_HIDDEN
1082 int mi_lttng_event(struct mi_writer *writer,
1083 struct lttng_event *event, int is_open, enum lttng_domain_type domain)
1084 {
1085 int ret;
1086
1087 ret = mi_lttng_event_common_attributes(writer, event);
1088 if (ret) {
1089 goto end;
1090 }
1091
1092 switch (event->type) {
1093 case LTTNG_EVENT_TRACEPOINT:
1094 {
1095 if (event->loglevel != -1) {
1096 ret = mi_lttng_event_tracepoint_loglevel(writer, event, domain);
1097 } else {
1098 ret = mi_lttng_event_tracepoint_no_loglevel(writer, event);
1099 }
1100 break;
1101 }
1102 case LTTNG_EVENT_FUNCTION:
1103 /* Fallthrough */
1104 case LTTNG_EVENT_PROBE:
1105 ret = mi_lttng_event_function_probe(writer, event);
1106 break;
1107 case LTTNG_EVENT_FUNCTION_ENTRY:
1108 ret = mi_lttng_event_function_entry(writer, event);
1109 break;
1110 case LTTNG_EVENT_ALL:
1111 /* Fallthrough */
1112 default:
1113 break;
1114 }
1115
1116 if (!is_open) {
1117 ret = mi_lttng_writer_close_element(writer);
1118 }
1119
1120 end:
1121 return ret;
1122 }
1123
1124 LTTNG_HIDDEN
1125 int mi_lttng_trackers_open(struct mi_writer *writer)
1126 {
1127 return mi_lttng_writer_open_element(writer, config_element_trackers);
1128 }
1129
1130 LTTNG_HIDDEN
1131 int mi_lttng_pid_tracker_open(struct mi_writer *writer)
1132 {
1133 int ret;
1134
1135 /* Open element pid_tracker */
1136 ret = mi_lttng_writer_open_element(writer, config_element_pid_tracker);
1137 if (ret) {
1138 goto end;
1139 }
1140
1141 /* Open targets element */
1142 ret = mi_lttng_targets_open(writer);
1143 end:
1144 return ret;
1145 }
1146
1147 LTTNG_HIDDEN
1148 int mi_lttng_pids_open(struct mi_writer *writer)
1149 {
1150 return mi_lttng_writer_open_element(writer, config_element_pids);
1151 }
1152
1153 /*
1154 * TODO: move the listing of pid for user agent to process semantic on
1155 * mi api bump. The use of process element break the mi api.
1156 */
1157 LTTNG_HIDDEN
1158 int mi_lttng_pid(struct mi_writer *writer, pid_t pid , const char *name,
1159 int is_open)
1160 {
1161 int ret;
1162
1163 /* Open pid process */
1164 ret = mi_lttng_writer_open_element(writer, config_element_pid);
1165 if (ret) {
1166 goto end;
1167 }
1168
1169 /* Writing pid number */
1170 ret = mi_lttng_writer_write_element_signed_int(writer,
1171 mi_lttng_element_pid_id, (int)pid);
1172 if (ret) {
1173 goto end;
1174 }
1175
1176 /* Writing name of the process */
1177 if (name) {
1178 ret = mi_lttng_writer_write_element_string(writer, config_element_name,
1179 name);
1180 if (ret) {
1181 goto end;
1182 }
1183 }
1184
1185 if (!is_open) {
1186 /* Closing Pid */
1187 ret = mi_lttng_writer_close_element(writer);
1188 }
1189
1190 end:
1191 return ret;
1192 }
1193
1194 LTTNG_HIDDEN
1195 int mi_lttng_targets_open(struct mi_writer *writer)
1196 {
1197 return mi_lttng_writer_open_element(writer,
1198 config_element_targets);
1199 }
1200
1201 LTTNG_HIDDEN
1202 int mi_lttng_pid_target(struct mi_writer *writer, pid_t pid, int is_open)
1203 {
1204 int ret;
1205
1206 ret = mi_lttng_writer_open_element(writer,
1207 config_element_target_pid);
1208 if (ret) {
1209 goto end;
1210 }
1211
1212 /* Writing pid number
1213 * Special case for element all on track untrack command
1214 * All pid is represented as wildcard *
1215 */
1216 if ((int) pid == -1) {
1217 ret = mi_lttng_writer_write_element_string(writer,
1218 config_element_pid,
1219 mi_lttng_element_track_untrack_all_wildcard);
1220 } else {
1221 ret = mi_lttng_writer_write_element_signed_int(writer,
1222 config_element_pid, (int) pid);
1223 }
1224 if (ret) {
1225 goto end;
1226 }
1227
1228 if (!is_open) {
1229 ret = mi_lttng_writer_close_element(writer);
1230 if (ret) {
1231 goto end;
1232 }
1233 }
1234
1235 end:
1236 return ret;
1237 }
1238
1239 LTTNG_HIDDEN
1240 int mi_lttng_event_fields_open(struct mi_writer *writer)
1241 {
1242 return mi_lttng_writer_open_element(writer, mi_lttng_element_event_fields);
1243 }
1244
1245 LTTNG_HIDDEN
1246 int mi_lttng_event_field(struct mi_writer *writer,
1247 struct lttng_event_field *field)
1248 {
1249 int ret;
1250
1251 if (!field->field_name[0]) {
1252 ret = 0;
1253 goto end;
1254 }
1255
1256 /* Open field */
1257 ret = mi_lttng_writer_open_element(writer, mi_lttng_element_event_field);
1258 if (ret) {
1259 goto end;
1260 }
1261
1262 if (!field->field_name[0]) {
1263 goto close;
1264 }
1265
1266 /* Name */
1267 ret = mi_lttng_writer_write_element_string(writer, config_element_name,
1268 field->field_name);
1269 if (ret) {
1270 goto end;
1271 }
1272
1273 /* Type */
1274 ret = mi_lttng_writer_write_element_string(writer, config_element_type,
1275 mi_lttng_eventfieldtype_string(field->type));
1276 if (ret) {
1277 goto end;
1278 }
1279
1280 /* nowrite */
1281 ret = mi_lttng_writer_write_element_signed_int(writer,
1282 mi_lttng_element_nowrite, field->nowrite);
1283 if (ret) {
1284 goto end;
1285 }
1286
1287 close:
1288 /* Close field element */
1289 ret = mi_lttng_writer_close_element(writer);
1290
1291 end:
1292 return ret;
1293 }
1294
1295 LTTNG_HIDDEN
1296 int mi_lttng_calibrate(struct mi_writer *writer,
1297 struct lttng_calibrate *calibrate)
1298 {
1299 int ret;
1300
1301 /* Open calibrate element */
1302 ret = mi_lttng_writer_open_element(writer, mi_lttng_element_calibrate);
1303 if (ret) {
1304 goto end;
1305 }
1306
1307 /* Calibration type */
1308 ret = mi_lttng_writer_write_element_string(writer, config_element_type,
1309 mi_lttng_calibratetype_string(calibrate->type));
1310 if (ret) {
1311 goto end;
1312 }
1313
1314 /* Closing calibrate element */
1315 ret = mi_lttng_writer_close_element(writer);
1316 end:
1317 return ret;
1318 }
1319
1320 LTTNG_HIDDEN
1321 int mi_lttng_context(struct mi_writer *writer,
1322 struct lttng_event_context *context, int is_open)
1323 {
1324 int ret;
1325 const char *type_string;
1326 struct lttng_event_perf_counter_ctx *perf_context;
1327 /* Open context */
1328 ret = mi_lttng_writer_open_element(writer , config_element_context);
1329 if (ret) {
1330 goto end;
1331 }
1332
1333 type_string = mi_lttng_event_contexttype_string(context->ctx);
1334 if (!type_string) {
1335 ret = -LTTNG_ERR_INVALID;
1336 goto end;
1337 }
1338
1339 /* Print context type */
1340 ret = mi_lttng_writer_write_element_string(writer, config_element_type,
1341 type_string);
1342
1343 /* Special case for PERF_*_COUNTER
1344 * print the lttng_event_perf_counter_ctx*/
1345 switch (context->ctx) {
1346 case LTTNG_EVENT_CONTEXT_PERF_COUNTER:
1347 case LTTNG_EVENT_CONTEXT_PERF_THREAD_COUNTER:
1348 case LTTNG_EVENT_CONTEXT_PERF_CPU_COUNTER:
1349 perf_context = &context->u.perf_counter;
1350 ret = mi_lttng_perf_counter_context(writer, perf_context);
1351 if (ret) {
1352 goto end;
1353 }
1354 break;
1355 default:
1356 break;
1357 }
1358
1359 /* Close context */
1360 if (!is_open) {
1361 ret = mi_lttng_writer_close_element(writer);
1362 }
1363
1364 end:
1365 return ret;
1366 }
1367
1368 LTTNG_HIDDEN
1369 int mi_lttng_perf_counter_context(struct mi_writer *writer,
1370 struct lttng_event_perf_counter_ctx *perf_context)
1371 {
1372 int ret;
1373
1374 /* Open perf_counter_context */
1375 ret = mi_lttng_writer_open_element(writer,
1376 mi_lttng_element_perf_counter_context);
1377 if (ret) {
1378 goto end;
1379 }
1380
1381 /* Type */
1382 ret = mi_lttng_writer_write_element_unsigned_int(writer,
1383 config_element_type, perf_context->type);
1384 if (ret) {
1385 goto end;
1386 }
1387
1388 /* Config */
1389 ret = mi_lttng_writer_write_element_unsigned_int(writer,
1390 config_element_config, perf_context->config);
1391 if (ret) {
1392 goto end;
1393 }
1394
1395 /* Name of the perf counter */
1396 ret = mi_lttng_writer_write_element_string(writer,
1397 config_element_name, perf_context->name);
1398 if (ret) {
1399 goto end;
1400 }
1401
1402 /* Close perf_counter_context */
1403 ret = mi_lttng_writer_close_element(writer);
1404 end:
1405 return ret;
1406 }
1407
1408 LTTNG_HIDDEN
1409 int mi_lttng_snapshot_output_session_name(struct mi_writer *writer,
1410 const char *session_name)
1411 {
1412 int ret;
1413
1414 /* Open session element */
1415 ret = mi_lttng_writer_open_element(writer, config_element_session);
1416 if (ret) {
1417 goto end;
1418 }
1419
1420 /* Snapshot output list for current session name */
1421 ret = mi_lttng_writer_write_element_string(writer, config_element_name,
1422 session_name);
1423 if (ret) {
1424 goto end;
1425 }
1426
1427 /* Open element snapshots (sequence one snapshot) */
1428 ret = mi_lttng_writer_open_element(writer, mi_lttng_element_snapshots);
1429 if (ret) {
1430 goto end;
1431 }
1432
1433 end:
1434 return ret;
1435 }
1436
1437 LTTNG_HIDDEN
1438 int mi_lttng_snapshot_list_output(struct mi_writer *writer,
1439 struct lttng_snapshot_output *output)
1440 {
1441 int ret;
1442
1443 /* Open element snapshot output */
1444 ret = mi_lttng_writer_open_element(writer,
1445 mi_lttng_element_command_snapshot);
1446 if (ret) {
1447 goto end;
1448 }
1449
1450 /* ID of the snapshot output */
1451 ret = mi_lttng_writer_write_element_unsigned_int(writer,
1452 mi_lttng_element_id, output->id);
1453 if (ret) {
1454 goto end;
1455 }
1456
1457 /* Name of the output */
1458 ret = mi_lttng_writer_write_element_string(writer, config_element_name,
1459 output->name);
1460 if (ret) {
1461 goto end;
1462 }
1463
1464 /* Destination of the output (ctrl_url)*/
1465 ret = mi_lttng_writer_write_element_string(writer,
1466 mi_lttng_element_snapshot_ctrl_url, output->ctrl_url);
1467 if (ret) {
1468 goto end;
1469 }
1470
1471 /* Destination of the output (data_url) */
1472 ret = mi_lttng_writer_write_element_string(writer,
1473 mi_lttng_element_snapshot_data_url, output->data_url);
1474 if (ret) {
1475 goto end;
1476 }
1477
1478 /* total size of all stream combined */
1479 ret = mi_lttng_writer_write_element_unsigned_int(writer,
1480 mi_lttng_element_snapshot_max_size, output->max_size);
1481 if (ret) {
1482 goto end;
1483 }
1484
1485 /* Close snapshot output element */
1486 ret = mi_lttng_writer_close_element(writer);
1487
1488 end:
1489 return ret;
1490 }
1491
1492 LTTNG_HIDDEN
1493 int mi_lttng_snapshot_del_output(struct mi_writer *writer, int id,
1494 const char *name, const char *current_session_name)
1495 {
1496 int ret;
1497
1498 /* Open element del_snapshot */
1499 ret = mi_lttng_writer_open_element(writer,
1500 mi_lttng_element_command_snapshot);
1501 if (ret) {
1502 goto end;
1503 }
1504
1505
1506 if (id != UINT32_MAX) {
1507 /* "Snapshot output "id" successfully deleted
1508 * for "current_session_name"
1509 * ID of the snapshot output
1510 */
1511 ret = mi_lttng_writer_write_element_unsigned_int(writer,
1512 mi_lttng_element_id, id);
1513 if (ret) {
1514 goto end;
1515 }
1516 } else {
1517 /* "Snapshot output "name" successfully deleted
1518 * for session "current_session_name"
1519 * Name of the output
1520 */
1521 ret = mi_lttng_writer_write_element_string(writer, config_element_name,
1522 name);
1523 if (ret) {
1524 goto end;
1525 }
1526 }
1527
1528 /* Snapshot was deleted for session "current_session_name"*/
1529 ret = mi_lttng_writer_write_element_string(writer,
1530 mi_lttng_element_snapshot_session_name,
1531 current_session_name);
1532 if (ret) {
1533 goto end;
1534 }
1535
1536 /* Close snapshot element */
1537 ret = mi_lttng_writer_close_element(writer);
1538
1539 end:
1540 return ret;
1541 }
1542
1543 LTTNG_HIDDEN
1544 int mi_lttng_snapshot_add_output(struct mi_writer *writer,
1545 const char *current_session_name, const char *n_ptr,
1546 struct lttng_snapshot_output *output)
1547 {
1548 int ret;
1549
1550 /* Open element snapshot */
1551 ret = mi_lttng_writer_open_element(writer,
1552 mi_lttng_element_command_snapshot);
1553 if (ret) {
1554 goto end;
1555 }
1556
1557 /* Snapshot output id */
1558 ret = mi_lttng_writer_write_element_unsigned_int(writer,
1559 mi_lttng_element_id, output->id);
1560 if (ret) {
1561 goto end;
1562 }
1563
1564 /* Snapshot output names */
1565 ret = mi_lttng_writer_write_element_string(writer,
1566 config_element_name, n_ptr);
1567 if (ret) {
1568 goto end;
1569 }
1570
1571 /* Destination of the output (ctrl_url)*/
1572 ret = mi_lttng_writer_write_element_string(writer,
1573 mi_lttng_element_snapshot_ctrl_url, output->ctrl_url);
1574 if (ret) {
1575 goto end;
1576 }
1577
1578 /* Snapshot added for session "current_session_name"*/
1579 ret = mi_lttng_writer_write_element_string(writer,
1580 mi_lttng_element_snapshot_session_name, current_session_name);
1581 if (ret) {
1582 goto end;
1583 }
1584
1585 /* total size of all stream combined */
1586 ret = mi_lttng_writer_write_element_unsigned_int(writer,
1587 mi_lttng_element_snapshot_max_size, output->max_size);
1588 if (ret) {
1589 goto end;
1590 }
1591
1592 /* Close snapshot element */
1593 ret = mi_lttng_writer_close_element(writer);
1594
1595 end:
1596 return ret;
1597 }
1598
1599 LTTNG_HIDDEN
1600 int mi_lttng_snapshot_record(struct mi_writer *writer,
1601 const char *current_session_name, const char *url,
1602 const char *cmdline_ctrl_url, const char *cmdline_data_url)
1603 {
1604 int ret;
1605
1606 /* Open element snapshot */
1607 ret = mi_lttng_writer_open_element(writer,
1608 mi_lttng_element_command_snapshot);
1609 if (ret) {
1610 goto end;
1611 }
1612
1613 /*
1614 * If a valid an URL was given, serialize it,
1615 * else take the command line data and ctrl urls*/
1616 if (url) {
1617 /* Destination of the output (ctrl_url)*/
1618 ret = mi_lttng_writer_write_element_string(writer,
1619 mi_lttng_element_snapshot_ctrl_url, url);
1620 if (ret) {
1621 goto end;
1622 }
1623 } else if (cmdline_ctrl_url) {
1624 /* Destination of the output (ctrl_url)*/
1625 ret = mi_lttng_writer_write_element_string(writer,
1626 mi_lttng_element_snapshot_ctrl_url, cmdline_ctrl_url);
1627 if (ret) {
1628 goto end;
1629 }
1630
1631 /* Destination of the output (data_url) */
1632 ret = mi_lttng_writer_write_element_string(writer,
1633 mi_lttng_element_snapshot_data_url, cmdline_data_url);
1634 if (ret) {
1635 goto end;
1636 }
1637 }
1638
1639 /* Close record_snapshot element */
1640 ret = mi_lttng_writer_close_element(writer);
1641
1642 end:
1643 return ret;
1644 }
This page took 0.065119 seconds and 5 git commands to generate.