2 * Copyright (C) 2014 - Jérémie Galarneau <jeremie.galarneau@efficios.com>
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License, version 2 only, as
6 * published by the Free Software Foundation.
8 * This program is distributed in the hope that it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13 * You should have received a copy of the GNU General Public License along with
14 * this program; if not, write to the Free Software Foundation, Inc., 51
15 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
23 #include <urcu/uatomic.h>
26 #include <common/defaults.h>
27 #include <common/error.h>
28 #include <common/config/config.h>
29 #include <common/utils.h>
30 #include <common/runas.h>
31 #include <lttng/save-internal.h>
37 #include "trace-ust.h"
41 int save_kernel_channel_attributes(struct config_writer
*writer
,
42 struct lttng_channel_attr
*attr
)
46 ret
= config_writer_write_element_string(writer
,
47 config_element_overwrite_mode
,
48 attr
->overwrite
? config_overwrite_mode_overwrite
:
49 config_overwrite_mode_discard
);
54 ret
= config_writer_write_element_unsigned_int(writer
,
55 config_element_subbuf_size
, attr
->subbuf_size
);
60 ret
= config_writer_write_element_unsigned_int(writer
,
61 config_element_num_subbuf
,
67 ret
= config_writer_write_element_unsigned_int(writer
,
68 config_element_switch_timer_interval
,
69 attr
->switch_timer_interval
);
74 ret
= config_writer_write_element_unsigned_int(writer
,
75 config_element_read_timer_interval
,
76 attr
->read_timer_interval
);
81 ret
= config_writer_write_element_string(writer
,
82 config_element_output_type
,
83 attr
->output
== LTTNG_EVENT_SPLICE
?
84 config_output_type_splice
: config_output_type_mmap
);
89 ret
= config_writer_write_element_unsigned_int(writer
,
90 config_element_tracefile_size
, attr
->tracefile_size
);
95 ret
= config_writer_write_element_unsigned_int(writer
,
96 config_element_tracefile_count
,
97 attr
->tracefile_count
);
102 ret
= config_writer_write_element_unsigned_int(writer
,
103 config_element_live_timer_interval
,
104 attr
->live_timer_interval
);
109 return ret
? LTTNG_ERR_SAVE_IO_FAIL
: 0;
113 int save_ust_channel_attributes(struct config_writer
*writer
,
114 struct lttng_ust_channel_attr
*attr
)
118 ret
= config_writer_write_element_string(writer
,
119 config_element_overwrite_mode
,
120 attr
->overwrite
? config_overwrite_mode_overwrite
:
121 config_overwrite_mode_discard
);
126 ret
= config_writer_write_element_unsigned_int(writer
,
127 config_element_subbuf_size
, attr
->subbuf_size
);
132 ret
= config_writer_write_element_unsigned_int(writer
,
133 config_element_num_subbuf
,
139 ret
= config_writer_write_element_unsigned_int(writer
,
140 config_element_switch_timer_interval
,
141 attr
->switch_timer_interval
);
146 ret
= config_writer_write_element_unsigned_int(writer
,
147 config_element_read_timer_interval
,
148 attr
->read_timer_interval
);
153 ret
= config_writer_write_element_string(writer
,
154 config_element_output_type
,
155 attr
->output
== LTTNG_UST_MMAP
?
156 config_output_type_mmap
: config_output_type_splice
);
161 return ret
? LTTNG_ERR_SAVE_IO_FAIL
: 0;
165 const char *get_kernel_instrumentation_string(
166 enum lttng_kernel_instrumentation instrumentation
)
168 const char *instrumentation_string
;
170 switch (instrumentation
) {
171 case LTTNG_KERNEL_ALL
:
172 instrumentation_string
= config_event_type_all
;
174 case LTTNG_KERNEL_TRACEPOINT
:
175 instrumentation_string
= config_event_type_tracepoint
;
177 case LTTNG_KERNEL_KPROBE
:
178 instrumentation_string
= config_event_type_kprobe
;
180 case LTTNG_KERNEL_FUNCTION
:
181 instrumentation_string
= config_event_type_function
;
183 case LTTNG_KERNEL_KRETPROBE
:
184 instrumentation_string
= config_event_type_kretprobe
;
186 case LTTNG_KERNEL_NOOP
:
187 instrumentation_string
= config_event_type_noop
;
189 case LTTNG_KERNEL_SYSCALL
:
190 instrumentation_string
= config_event_type_syscall
;
193 instrumentation_string
= NULL
;
196 return instrumentation_string
;
200 const char *get_kernel_context_type_string(
201 enum lttng_kernel_context_type context_type
)
203 const char *context_type_string
;
205 switch (context_type
) {
206 case LTTNG_KERNEL_CONTEXT_PID
:
207 context_type_string
= config_event_context_pid
;
209 case LTTNG_KERNEL_CONTEXT_PROCNAME
:
210 context_type_string
= config_event_context_procname
;
212 case LTTNG_KERNEL_CONTEXT_PRIO
:
213 context_type_string
= config_event_context_prio
;
215 case LTTNG_KERNEL_CONTEXT_NICE
:
216 context_type_string
= config_event_context_nice
;
218 case LTTNG_KERNEL_CONTEXT_VPID
:
219 context_type_string
= config_event_context_vpid
;
221 case LTTNG_KERNEL_CONTEXT_TID
:
222 context_type_string
= config_event_context_tid
;
224 case LTTNG_KERNEL_CONTEXT_VTID
:
225 context_type_string
= config_event_context_vtid
;
227 case LTTNG_KERNEL_CONTEXT_PPID
:
228 context_type_string
= config_event_context_ppid
;
230 case LTTNG_KERNEL_CONTEXT_VPPID
:
231 context_type_string
= config_event_context_vppid
;
233 case LTTNG_KERNEL_CONTEXT_HOSTNAME
:
234 context_type_string
= config_event_context_hostname
;
237 context_type_string
= NULL
;
240 return context_type_string
;
244 const char *get_ust_context_type_string(
245 enum lttng_ust_context_type context_type
)
247 const char *context_type_string
;
249 switch (context_type
) {
250 case LTTNG_UST_CONTEXT_PROCNAME
:
251 context_type_string
= config_event_context_procname
;
253 case LTTNG_UST_CONTEXT_VPID
:
254 context_type_string
= config_event_context_vpid
;
256 case LTTNG_UST_CONTEXT_VTID
:
257 context_type_string
= config_event_context_vtid
;
259 case LTTNG_UST_CONTEXT_IP
:
260 context_type_string
= config_event_context_ip
;
262 case LTTNG_UST_CONTEXT_PTHREAD_ID
:
263 context_type_string
= config_event_context_pthread_id
;
265 case LTTNG_UST_CONTEXT_PERF_THREAD_COUNTER
:
267 * Error, should not be stored in the XML, perf contexts
268 * are stored as a node of type event_perf_context_type.
271 context_type_string
= NULL
;
275 return context_type_string
;
279 const char *get_buffer_type_string(
280 enum lttng_buffer_type buffer_type
)
282 const char *buffer_type_string
;
284 switch (buffer_type
) {
285 case LTTNG_BUFFER_PER_PID
:
286 buffer_type_string
= config_buffer_type_per_pid
;
288 case LTTNG_BUFFER_PER_UID
:
289 buffer_type_string
= config_buffer_type_per_uid
;
291 case LTTNG_BUFFER_GLOBAL
:
292 buffer_type_string
= config_buffer_type_global
;
295 buffer_type_string
= NULL
;
298 return buffer_type_string
;
302 const char *get_loglevel_type_string(
303 enum lttng_ust_loglevel_type loglevel_type
)
305 const char *loglevel_type_string
;
307 switch (loglevel_type
) {
308 case LTTNG_UST_LOGLEVEL_ALL
:
309 loglevel_type_string
= config_loglevel_type_all
;
311 case LTTNG_UST_LOGLEVEL_RANGE
:
312 loglevel_type_string
= config_loglevel_type_range
;
314 case LTTNG_UST_LOGLEVEL_SINGLE
:
315 loglevel_type_string
= config_loglevel_type_single
;
318 loglevel_type_string
= NULL
;
321 return loglevel_type_string
;
325 int save_kernel_event(struct config_writer
*writer
,
326 struct ltt_kernel_event
*event
)
329 const char *instrumentation_type
;
331 ret
= config_writer_open_element(writer
, config_element_event
);
333 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
337 if (event
->event
->name
[0]) {
338 ret
= config_writer_write_element_string(writer
,
339 config_element_name
, event
->event
->name
);
341 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
346 ret
= config_writer_write_element_bool(writer
, config_element_enabled
,
349 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
353 instrumentation_type
= get_kernel_instrumentation_string(
354 event
->event
->instrumentation
);
355 if (!instrumentation_type
) {
356 ret
= LTTNG_ERR_INVALID
;
360 ret
= config_writer_write_element_string(writer
, config_element_type
,
361 instrumentation_type
);
363 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
367 if (event
->filter_expression
) {
368 ret
= config_writer_write_element_string(writer
,
369 config_element_filter
,
370 event
->filter_expression
);
372 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
377 if (event
->event
->instrumentation
== LTTNG_KERNEL_FUNCTION
||
378 event
->event
->instrumentation
== LTTNG_KERNEL_KPROBE
||
379 event
->event
->instrumentation
== LTTNG_KERNEL_KRETPROBE
) {
381 ret
= config_writer_open_element(writer
,
382 config_element_attributes
);
384 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
388 switch (event
->event
->instrumentation
) {
389 case LTTNG_KERNEL_SYSCALL
:
390 case LTTNG_KERNEL_FUNCTION
:
391 ret
= config_writer_open_element(writer
,
392 config_element_function_attributes
);
394 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
398 ret
= config_writer_write_element_string(writer
,
400 event
->event
->u
.ftrace
.symbol_name
);
402 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
406 /* /function attributes */
407 ret
= config_writer_close_element(writer
);
409 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
413 case LTTNG_KERNEL_KPROBE
:
414 case LTTNG_KERNEL_KRETPROBE
:
416 const char *symbol_name
;
420 if (event
->event
->instrumentation
==
421 LTTNG_KERNEL_KPROBE
) {
423 * Comments in lttng-kernel.h mention that
424 * either addr or symbol_name are set, not both.
426 addr
= event
->event
->u
.kprobe
.addr
;
427 offset
= event
->event
->u
.kprobe
.offset
;
428 symbol_name
= addr
? NULL
:
429 event
->event
->u
.kprobe
.symbol_name
;
432 event
->event
->u
.kretprobe
.symbol_name
;
433 addr
= event
->event
->u
.kretprobe
.addr
;
434 offset
= event
->event
->u
.kretprobe
.offset
;
437 ret
= config_writer_open_element(writer
,
438 config_element_probe_attributes
);
440 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
445 ret
= config_writer_write_element_string(writer
,
446 config_element_symbol_name
,
449 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
455 ret
= config_writer_write_element_unsigned_int(
456 writer
, config_element_address
, addr
);
458 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
464 ret
= config_writer_write_element_unsigned_int(
465 writer
, config_element_offset
, offset
);
467 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
472 ret
= config_writer_close_element(writer
);
474 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
480 ERR("Unsupported kernel instrumentation type.");
481 ret
= LTTNG_ERR_INVALID
;
486 ret
= config_writer_close_element(writer
);
488 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
494 ret
= config_writer_close_element(writer
);
496 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
504 int save_kernel_syscall(struct config_writer
*writer
,
505 struct ltt_kernel_channel
*kchan
)
509 struct lttng_event
*events
= NULL
;
514 count
= syscall_list_channel(kchan
, &events
, 0);
516 /* No syscalls, just gracefully return. */
521 for (i
= 0; i
< count
; i
++) {
522 struct ltt_kernel_event
*kevent
;
524 /* Create a temporary kevent in order to save it. */
526 * TODO: struct lttng_event does not really work for a filter,
527 * but unfortunately, it is exposed as external API (and used as
528 * internal representation. Using NULL meanwhile.
530 kevent
= trace_kernel_create_event(&events
[i
],
536 /* Init list in order so the destroy call can del the node. */
537 CDS_INIT_LIST_HEAD(&kevent
->list
);
539 ret
= save_kernel_event(writer
, kevent
);
540 trace_kernel_destroy_event(kevent
);
546 /* Everything went well */
555 int save_kernel_events(struct config_writer
*writer
,
556 struct ltt_kernel_channel
*kchan
)
559 struct ltt_kernel_event
*event
;
561 ret
= config_writer_open_element(writer
, config_element_events
);
563 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
567 cds_list_for_each_entry(event
, &kchan
->events_list
.head
, list
) {
568 ret
= save_kernel_event(writer
, event
);
574 /* Save syscalls if any. */
575 ret
= save_kernel_syscall(writer
, kchan
);
581 ret
= config_writer_close_element(writer
);
583 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
591 int save_ust_event(struct config_writer
*writer
,
592 struct ltt_ust_event
*event
)
595 const char *loglevel_type_string
;
597 ret
= config_writer_open_element(writer
, config_element_event
);
599 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
603 if (event
->attr
.name
[0]) {
604 ret
= config_writer_write_element_string(writer
,
605 config_element_name
, event
->attr
.name
);
607 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
612 ret
= config_writer_write_element_bool(writer
, config_element_enabled
,
615 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
619 if (event
->attr
.instrumentation
!= LTTNG_UST_TRACEPOINT
) {
620 ERR("Unsupported UST instrumentation type.");
621 ret
= LTTNG_ERR_INVALID
;
624 ret
= config_writer_write_element_string(writer
, config_element_type
,
625 config_event_type_tracepoint
);
627 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
631 loglevel_type_string
= get_loglevel_type_string(
632 event
->attr
.loglevel_type
);
633 if (!loglevel_type_string
) {
634 ERR("Unsupported UST loglevel type.");
635 ret
= LTTNG_ERR_INVALID
;
639 ret
= config_writer_write_element_string(writer
,
640 config_element_loglevel_type
, loglevel_type_string
);
642 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
646 /* The log level is irrelevant if no "filtering" is enabled */
647 if (event
->attr
.loglevel_type
!= LTTNG_UST_LOGLEVEL_ALL
) {
648 ret
= config_writer_write_element_signed_int(writer
,
649 config_element_loglevel
, event
->attr
.loglevel
);
651 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
656 if (event
->filter_expression
) {
657 ret
= config_writer_write_element_string(writer
,
658 config_element_filter
, event
->filter_expression
);
660 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
665 if (event
->exclusion
&& event
->exclusion
->count
) {
668 ret
= config_writer_open_element(writer
,
669 config_element_exclusions
);
671 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
675 for (i
= 0; i
< event
->exclusion
->count
; i
++) {
676 ret
= config_writer_write_element_string(writer
,
677 config_element_exclusion
,
678 &event
->exclusion
->names
[0][i
]);
680 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
686 ret
= config_writer_close_element(writer
);
688 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
694 ret
= config_writer_close_element(writer
);
696 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
704 int save_ust_events(struct config_writer
*writer
,
705 struct lttng_ht
*events
)
708 struct ltt_ust_event
*event
;
709 struct lttng_ht_node_str
*node
;
710 struct lttng_ht_iter iter
;
712 ret
= config_writer_open_element(writer
, config_element_events
);
714 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
719 cds_lfht_for_each_entry(events
->ht
, &iter
.iter
, node
, node
) {
720 event
= caa_container_of(node
, struct ltt_ust_event
, node
);
722 if (event
->internal
) {
723 /* Internal events must not be exposed to clients */
726 ret
= save_ust_event(writer
, event
);
735 ret
= config_writer_close_element(writer
);
737 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
745 void init_ust_event_from_agent_event(struct ltt_ust_event
*ust_event
,
746 struct agent_event
*agent_event
)
748 ust_event
->enabled
= agent_event
->enabled
;
749 ust_event
->attr
.instrumentation
= LTTNG_UST_TRACEPOINT
;
750 strncpy(ust_event
->attr
.name
, agent_event
->name
, LTTNG_SYMBOL_NAME_LEN
);
751 ust_event
->attr
.loglevel_type
= agent_event
->loglevel_type
;
752 ust_event
->attr
.loglevel
= agent_event
->loglevel
;
753 ust_event
->filter_expression
= agent_event
->filter_expression
;
754 ust_event
->exclusion
= agent_event
->exclusion
;
758 int save_agent_events(struct config_writer
*writer
,
759 struct ltt_ust_channel
*chan
,
763 struct lttng_ht_iter iter
;
764 struct lttng_ht_node_str
*node
;
766 ret
= config_writer_open_element(writer
, config_element_events
);
768 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
773 cds_lfht_for_each_entry(agent
->events
->ht
, &iter
.iter
, node
, node
) {
775 struct agent_event
*agent_event
;
776 struct ltt_ust_event fake_event
;
778 memset(&fake_event
, 0, sizeof(fake_event
));
779 agent_event
= caa_container_of(node
, struct agent_event
, node
);
782 * Initialize a fake ust event to reuse the same serialization
783 * function since UST and agent events contain the same info
784 * (and one could wonder why they don't reuse the same
787 init_ust_event_from_agent_event(&fake_event
, agent_event
);
788 ret
= save_ust_event(writer
, &fake_event
);
797 ret
= config_writer_close_element(writer
);
799 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
807 int save_kernel_context(struct config_writer
*writer
,
808 struct lttng_kernel_context
*ctx
)
816 ret
= config_writer_open_element(writer
, config_element_context
);
818 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
822 if (ctx
->ctx
== LTTNG_KERNEL_CONTEXT_PERF_CPU_COUNTER
) {
823 ret
= config_writer_open_element(writer
, config_element_perf
);
825 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
829 ret
= config_writer_write_element_unsigned_int(writer
,
830 config_element_type
, ctx
->u
.perf_counter
.type
);
832 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
836 ret
= config_writer_write_element_unsigned_int(writer
,
837 config_element_config
, ctx
->u
.perf_counter
.config
);
839 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
843 ret
= config_writer_write_element_string(writer
,
844 config_element_name
, ctx
->u
.perf_counter
.name
);
846 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
851 ret
= config_writer_close_element(writer
);
853 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
857 const char *context_type_string
=
858 get_kernel_context_type_string(ctx
->ctx
);
860 if (!context_type_string
) {
861 ERR("Unsupported kernel context type.");
862 ret
= LTTNG_ERR_INVALID
;
866 ret
= config_writer_write_element_string(writer
,
867 config_element_type
, context_type_string
);
869 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
875 ret
= config_writer_close_element(writer
);
877 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
886 int save_kernel_contexts(struct config_writer
*writer
,
887 struct ltt_kernel_channel
*kchan
)
890 struct ltt_kernel_context
*ctx
;
892 if (cds_list_empty(&kchan
->ctx_list
)) {
897 ret
= config_writer_open_element(writer
, config_element_contexts
);
899 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
903 cds_list_for_each_entry(ctx
, &kchan
->ctx_list
, list
) {
904 ret
= save_kernel_context(writer
, &ctx
->ctx
);
911 ret
= config_writer_close_element(writer
);
913 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
921 int save_ust_context(struct config_writer
*writer
,
922 struct cds_list_head
*ctx_list
)
925 struct ltt_ust_context
*ctx
;
930 ret
= config_writer_open_element(writer
, config_element_contexts
);
932 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
936 cds_list_for_each_entry(ctx
, ctx_list
, list
) {
937 const char *context_type_string
;
940 ret
= config_writer_open_element(writer
,
941 config_element_context
);
943 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
947 if (ctx
->ctx
.ctx
== LTTNG_UST_CONTEXT_PERF_THREAD_COUNTER
) {
948 /* Perf contexts are saved as event_perf_context_type */
949 ret
= config_writer_open_element(writer
,
950 config_element_perf
);
952 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
956 ret
= config_writer_write_element_unsigned_int(writer
,
958 ctx
->ctx
.u
.perf_counter
.type
);
960 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
964 ret
= config_writer_write_element_unsigned_int(writer
,
965 config_element_config
,
966 ctx
->ctx
.u
.perf_counter
.config
);
968 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
972 ret
= config_writer_write_element_string(writer
,
974 ctx
->ctx
.u
.perf_counter
.name
);
976 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
981 ret
= config_writer_close_element(writer
);
983 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
987 /* Save context as event_context_type_type */
988 context_type_string
= get_ust_context_type_string(
990 if (!context_type_string
) {
991 ERR("Unsupported UST context type.")
992 ret
= LTTNG_ERR_INVALID
;
996 ret
= config_writer_write_element_string(writer
,
997 config_element_type
, context_type_string
);
999 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1005 ret
= config_writer_close_element(writer
);
1007 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1013 ret
= config_writer_close_element(writer
);
1015 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1023 int save_kernel_channel(struct config_writer
*writer
,
1024 struct ltt_kernel_channel
*kchan
)
1031 ret
= config_writer_open_element(writer
, config_element_channel
);
1033 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1037 ret
= config_writer_write_element_string(writer
, config_element_name
,
1038 kchan
->channel
->name
);
1040 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1044 ret
= config_writer_write_element_bool(writer
, config_element_enabled
,
1045 kchan
->channel
->enabled
);
1047 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1051 ret
= save_kernel_channel_attributes(writer
, &kchan
->channel
->attr
);
1056 ret
= save_kernel_events(writer
, kchan
);
1061 ret
= save_kernel_contexts(writer
, kchan
);
1067 ret
= config_writer_close_element(writer
);
1069 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1077 int save_ust_channel(struct config_writer
*writer
,
1078 struct ltt_ust_channel
*ust_chan
,
1079 struct ltt_ust_session
*session
)
1087 ret
= config_writer_open_element(writer
, config_element_channel
);
1089 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1093 ret
= config_writer_write_element_string(writer
, config_element_name
,
1096 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1100 ret
= config_writer_write_element_bool(writer
, config_element_enabled
,
1103 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1107 ret
= save_ust_channel_attributes(writer
, &ust_chan
->attr
);
1112 ret
= config_writer_write_element_unsigned_int(writer
,
1113 config_element_tracefile_size
, ust_chan
->tracefile_size
);
1115 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1119 ret
= config_writer_write_element_unsigned_int(writer
,
1120 config_element_tracefile_count
, ust_chan
->tracefile_count
);
1122 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1126 ret
= config_writer_write_element_unsigned_int(writer
,
1127 config_element_live_timer_interval
,
1128 session
->live_timer_interval
);
1130 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1134 if (ust_chan
->domain
== LTTNG_DOMAIN_UST
) {
1135 ret
= save_ust_events(writer
, ust_chan
->events
);
1140 struct agent
*agent
= NULL
;
1142 agent
= trace_ust_find_agent(session
, ust_chan
->domain
);
1144 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1145 ERR("Could not find agent associated to UST subdomain");
1150 * Channels associated with a UST sub-domain (such as JUL, Log4j
1151 * or Python) don't have any non-internal events. We retrieve
1152 * the "agent" events associated with this channel and serialize
1155 ret
= save_agent_events(writer
, ust_chan
, agent
);
1161 ret
= save_ust_context(writer
, &ust_chan
->ctx_list
);
1167 ret
= config_writer_close_element(writer
);
1169 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1177 int save_kernel_session(struct config_writer
*writer
,
1178 struct ltt_session
*session
)
1181 struct ltt_kernel_channel
*kchan
;
1186 ret
= config_writer_write_element_string(writer
, config_element_type
,
1187 config_domain_type_kernel
);
1189 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1193 ret
= config_writer_write_element_string(writer
,
1194 config_element_buffer_type
, config_buffer_type_global
);
1196 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1200 ret
= config_writer_open_element(writer
,
1201 config_element_channels
);
1203 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1207 cds_list_for_each_entry(kchan
, &session
->kernel_session
->channel_list
.head
,
1209 ret
= save_kernel_channel(writer
, kchan
);
1216 ret
= config_writer_close_element(writer
);
1218 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1226 const char *get_config_domain_str(enum lttng_domain_type domain
)
1228 const char *str_dom
;
1231 case LTTNG_DOMAIN_KERNEL
:
1232 str_dom
= config_domain_type_kernel
;
1234 case LTTNG_DOMAIN_UST
:
1235 str_dom
= config_domain_type_ust
;
1237 case LTTNG_DOMAIN_JUL
:
1238 str_dom
= config_domain_type_jul
;
1240 case LTTNG_DOMAIN_LOG4J
:
1241 str_dom
= config_domain_type_log4j
;
1243 case LTTNG_DOMAIN_PYTHON
:
1244 str_dom
= config_domain_type_python
;
1254 int save_pid_tracker(struct config_writer
*writer
,
1255 struct ltt_session
*sess
, int domain
)
1258 ssize_t nr_pids
= 0, i
;
1259 int32_t *pids
= NULL
;
1262 case LTTNG_DOMAIN_KERNEL
:
1264 nr_pids
= kernel_list_tracker_pids(sess
->kernel_session
, &pids
);
1266 ret
= LTTNG_ERR_KERN_LIST_FAIL
;
1271 case LTTNG_DOMAIN_UST
:
1273 nr_pids
= trace_ust_list_tracker_pids(sess
->ust_session
, &pids
);
1275 ret
= LTTNG_ERR_UST_LIST_FAIL
;
1280 case LTTNG_DOMAIN_JUL
:
1281 case LTTNG_DOMAIN_LOG4J
:
1282 case LTTNG_DOMAIN_PYTHON
:
1284 ret
= LTTNG_ERR_UNKNOWN_DOMAIN
;
1288 /* Only create a pid_tracker if enabled or untrack all */
1289 if (nr_pids
!= 1 || (nr_pids
== 1 && pids
[0] != -1)) {
1290 ret
= config_writer_open_element(writer
,
1291 config_element_pid_tracker
);
1293 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1297 ret
= config_writer_open_element(writer
,
1298 config_element_targets
);
1300 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1304 for (i
= 0; i
< nr_pids
; i
++) {
1305 ret
= config_writer_open_element(writer
,
1306 config_element_target_pid
);
1308 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1312 ret
= config_writer_write_element_unsigned_int(writer
,
1313 config_element_pid
, pids
[i
]);
1315 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1320 ret
= config_writer_close_element(writer
);
1322 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1328 ret
= config_writer_close_element(writer
);
1330 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1335 ret
= config_writer_close_element(writer
);
1337 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1347 int save_ust_domain(struct config_writer
*writer
,
1348 struct ltt_session
*session
, enum lttng_domain_type domain
)
1351 struct ltt_ust_channel
*ust_chan
;
1352 const char *buffer_type_string
;
1353 struct lttng_ht_node_str
*node
;
1354 struct lttng_ht_iter iter
;
1355 const char *config_domain_name
;
1360 ret
= config_writer_open_element(writer
,
1361 config_element_domain
);
1363 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1367 config_domain_name
= get_config_domain_str(domain
);
1368 if (!config_domain_name
) {
1369 ret
= LTTNG_ERR_INVALID
;
1373 ret
= config_writer_write_element_string(writer
,
1374 config_element_type
, config_domain_name
);
1376 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1380 buffer_type_string
= get_buffer_type_string(
1381 session
->ust_session
->buffer_type
);
1382 if (!buffer_type_string
) {
1383 ERR("Unsupported buffer type.");
1384 ret
= LTTNG_ERR_INVALID
;
1388 ret
= config_writer_write_element_string(writer
,
1389 config_element_buffer_type
, buffer_type_string
);
1391 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1395 ret
= config_writer_open_element(writer
, config_element_channels
);
1397 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1402 cds_lfht_for_each_entry(session
->ust_session
->domain_global
.channels
->ht
,
1403 &iter
.iter
, node
, node
) {
1404 ust_chan
= caa_container_of(node
, struct ltt_ust_channel
, node
);
1405 if (domain
== ust_chan
->domain
) {
1406 ret
= save_ust_channel(writer
, ust_chan
, session
->ust_session
);
1416 ret
= config_writer_close_element(writer
);
1418 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1422 if (domain
== LTTNG_DOMAIN_UST
) {
1423 ret
= config_writer_open_element(writer
,
1424 config_element_trackers
);
1426 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1430 ret
= save_pid_tracker(writer
, session
, LTTNG_DOMAIN_UST
);
1436 ret
= config_writer_close_element(writer
);
1443 ret
= config_writer_close_element(writer
);
1445 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1454 int save_domains(struct config_writer
*writer
, struct ltt_session
*session
)
1461 if (!session
->kernel_session
&& !session
->ust_session
) {
1465 ret
= config_writer_open_element(writer
, config_element_domains
);
1467 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1472 if (session
->kernel_session
) {
1473 ret
= config_writer_open_element(writer
,
1474 config_element_domain
);
1476 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1480 ret
= save_kernel_session(writer
, session
);
1485 ret
= config_writer_open_element(writer
,
1486 config_element_trackers
);
1488 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1492 ret
= save_pid_tracker(writer
, session
, LTTNG_DOMAIN_KERNEL
);
1498 ret
= config_writer_close_element(writer
);
1500 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1504 ret
= config_writer_close_element(writer
);
1506 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1511 if (session
->ust_session
) {
1512 ret
= save_ust_domain(writer
, session
, LTTNG_DOMAIN_UST
);
1517 ret
= save_ust_domain(writer
, session
, LTTNG_DOMAIN_JUL
);
1522 ret
= save_ust_domain(writer
, session
, LTTNG_DOMAIN_LOG4J
);
1527 ret
= save_ust_domain(writer
, session
, LTTNG_DOMAIN_PYTHON
);
1533 if (session
->ust_session
) {
1537 ret
= config_writer_close_element(writer
);
1539 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1547 int save_consumer_output(struct config_writer
*writer
,
1548 struct consumer_output
*output
)
1555 ret
= config_writer_open_element(writer
, config_element_consumer_output
);
1557 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1561 ret
= config_writer_write_element_bool(writer
, config_element_enabled
,
1564 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1568 ret
= config_writer_open_element(writer
, config_element_destination
);
1570 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1574 switch (output
->type
) {
1575 case CONSUMER_DST_LOCAL
:
1576 ret
= config_writer_write_element_string(writer
,
1577 config_element_path
, output
->dst
.trace_path
);
1579 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1583 case CONSUMER_DST_NET
:
1587 uri
= zmalloc(PATH_MAX
);
1589 ret
= LTTNG_ERR_NOMEM
;
1593 ret
= config_writer_open_element(writer
, config_element_net_output
);
1595 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1596 goto end_net_output
;
1599 if (output
->dst
.net
.control_isset
&&
1600 output
->dst
.net
.data_isset
) {
1601 ret
= uri_to_str_url(&output
->dst
.net
.control
, uri
, PATH_MAX
);
1603 ret
= LTTNG_ERR_INVALID
;
1604 goto end_net_output
;
1607 ret
= config_writer_write_element_string(writer
,
1608 config_element_control_uri
, uri
);
1610 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1611 goto end_net_output
;
1614 ret
= uri_to_str_url(&output
->dst
.net
.data
, uri
, PATH_MAX
);
1616 ret
= LTTNG_ERR_INVALID
;
1617 goto end_net_output
;
1620 ret
= config_writer_write_element_string(writer
,
1621 config_element_data_uri
, uri
);
1623 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1624 goto end_net_output
;
1633 ret
= !output
->dst
.net
.control_isset
?
1634 LTTNG_ERR_URL_CTRL_MISS
:
1635 LTTNG_ERR_URL_DATA_MISS
;
1640 ret
= config_writer_close_element(writer
);
1642 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1648 ERR("Unsupported consumer output type.");
1649 ret
= LTTNG_ERR_INVALID
;
1654 ret
= config_writer_close_element(writer
);
1656 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1660 /* /consumer_output */
1661 ret
= config_writer_close_element(writer
);
1663 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1671 int save_snapshot_outputs(struct config_writer
*writer
,
1672 struct snapshot
*snapshot
)
1675 struct lttng_ht_iter iter
;
1676 struct snapshot_output
*output
;
1681 ret
= config_writer_open_element(writer
, config_element_snapshot_outputs
);
1683 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1688 cds_lfht_for_each_entry(snapshot
->output_ht
->ht
, &iter
.iter
, output
,
1690 ret
= config_writer_open_element(writer
,
1691 config_element_output
);
1693 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1697 ret
= config_writer_write_element_string(writer
,
1698 config_element_name
, output
->name
);
1700 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1704 ret
= config_writer_write_element_unsigned_int(writer
,
1705 config_element_max_size
, output
->max_size
);
1707 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1711 ret
= save_consumer_output(writer
, output
->consumer
);
1717 ret
= config_writer_close_element(writer
);
1719 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1725 /* /snapshot_outputs */
1726 ret
= config_writer_close_element(writer
);
1728 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1740 int save_session_output(struct config_writer
*writer
,
1741 struct ltt_session
*session
)
1748 if ((session
->snapshot_mode
&& session
->snapshot
.nb_output
== 0) ||
1749 (!session
->snapshot_mode
&& !session
->consumer
)) {
1750 /* Session is in no output mode */
1755 ret
= config_writer_open_element(writer
, config_element_output
);
1757 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1761 if (session
->snapshot_mode
) {
1762 ret
= save_snapshot_outputs(writer
, &session
->snapshot
);
1767 if (session
->consumer
) {
1768 ret
= save_consumer_output(writer
, session
->consumer
);
1776 ret
= config_writer_close_element(writer
);
1778 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1786 * Save the given session.
1788 * Return 0 on success else a LTTNG_ERR* code.
1791 int save_session(struct ltt_session
*session
,
1792 struct lttng_save_session_attr
*attr
, lttng_sock_cred
*creds
)
1795 unsigned int file_opened
= 0; /* Indicate if the file has been opened */
1796 char config_file_path
[PATH_MAX
];
1798 struct config_writer
*writer
= NULL
;
1799 size_t session_name_len
;
1800 const char *provided_path
;
1806 session_name_len
= strlen(session
->name
);
1807 memset(config_file_path
, 0, sizeof(config_file_path
));
1809 if (!session_access_ok(session
,
1810 LTTNG_SOCK_GET_UID_CRED(creds
),
1811 LTTNG_SOCK_GET_GID_CRED(creds
))) {
1812 ret
= LTTNG_ERR_EPERM
;
1816 provided_path
= lttng_save_session_attr_get_output_url(attr
);
1817 if (provided_path
) {
1818 DBG3("Save session in provided path %s", provided_path
);
1819 len
= strlen(provided_path
);
1820 if (len
>= sizeof(config_file_path
)) {
1821 ret
= LTTNG_ERR_SET_URL
;
1824 strncpy(config_file_path
, provided_path
, len
);
1827 char *home_dir
= utils_get_user_home_dir(
1828 LTTNG_SOCK_GET_UID_CRED(creds
));
1830 ret
= LTTNG_ERR_SET_URL
;
1834 ret_len
= snprintf(config_file_path
, sizeof(config_file_path
),
1835 DEFAULT_SESSION_HOME_CONFIGPATH
, home_dir
);
1838 PERROR("snprintf save session");
1839 ret
= LTTNG_ERR_SET_URL
;
1846 * Check the path fits in the config file path dst including the '/'
1847 * followed by trailing .lttng extension and the NULL terminated string.
1849 if ((len
+ session_name_len
+ 2 +
1850 sizeof(DEFAULT_SESSION_CONFIG_FILE_EXTENSION
))
1851 > sizeof(config_file_path
)) {
1852 ret
= LTTNG_ERR_SET_URL
;
1856 ret
= run_as_mkdir_recursive(config_file_path
, S_IRWXU
| S_IRWXG
,
1857 LTTNG_SOCK_GET_UID_CRED(creds
), LTTNG_SOCK_GET_GID_CRED(creds
));
1859 ret
= LTTNG_ERR_SET_URL
;
1864 * At this point, we know that everything fits in the buffer. Validation
1865 * was done just above.
1867 config_file_path
[len
++] = '/';
1868 strncpy(config_file_path
+ len
, session
->name
, session_name_len
);
1869 len
+= session_name_len
;
1870 strcpy(config_file_path
+ len
, DEFAULT_SESSION_CONFIG_FILE_EXTENSION
);
1871 len
+= sizeof(DEFAULT_SESSION_CONFIG_FILE_EXTENSION
);
1872 config_file_path
[len
] = '\0';
1874 if (!access(config_file_path
, F_OK
) && !attr
->overwrite
) {
1875 /* File exists, notify the user since the overwrite flag is off. */
1876 ret
= LTTNG_ERR_SAVE_FILE_EXIST
;
1880 fd
= run_as_open(config_file_path
, O_CREAT
| O_WRONLY
| O_TRUNC
,
1881 S_IRUSR
| S_IWUSR
| S_IRGRP
| S_IWGRP
,
1882 LTTNG_SOCK_GET_UID_CRED(creds
), LTTNG_SOCK_GET_GID_CRED(creds
));
1884 PERROR("Could not create configuration file");
1885 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1890 writer
= config_writer_create(fd
, 1);
1892 ret
= LTTNG_ERR_NOMEM
;
1896 ret
= config_writer_open_element(writer
, config_element_sessions
);
1898 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1902 ret
= config_writer_open_element(writer
, config_element_session
);
1904 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1908 ret
= config_writer_write_element_string(writer
, config_element_name
,
1911 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1915 if(session
->shm_path
[0] != '\0') {
1916 ret
= config_writer_write_element_string(writer
,
1917 config_element_shared_memory_path
,
1920 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1925 ret
= save_domains(writer
, session
);
1930 ret
= config_writer_write_element_bool(writer
, config_element_started
,
1933 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1937 if (session
->snapshot_mode
|| session
->live_timer
) {
1938 ret
= config_writer_open_element(writer
, config_element_attributes
);
1940 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1944 if (session
->snapshot_mode
) {
1945 ret
= config_writer_write_element_bool(writer
,
1946 config_element_snapshot_mode
, 1);
1948 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1952 ret
= config_writer_write_element_unsigned_int(writer
,
1953 config_element_live_timer_interval
, session
->live_timer
);
1955 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1961 ret
= config_writer_close_element(writer
);
1963 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1968 ret
= save_session_output(writer
, session
);
1974 ret
= config_writer_close_element(writer
);
1976 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1981 ret
= config_writer_close_element(writer
);
1983 ret
= LTTNG_ERR_SAVE_IO_FAIL
;
1987 if (writer
&& config_writer_destroy(writer
)) {
1988 /* Preserve the original error code */
1989 ret
= ret
? ret
: LTTNG_ERR_SAVE_IO_FAIL
;
1992 /* Delete file in case of error */
1993 if (file_opened
&& unlink(config_file_path
)) {
1994 PERROR("Unlinking XML session configuration.");
2001 int cmd_save_sessions(struct lttng_save_session_attr
*attr
,
2002 lttng_sock_cred
*creds
)
2005 const char *session_name
;
2006 struct ltt_session
*session
;
2008 session_lock_list();
2010 session_name
= lttng_save_session_attr_get_session_name(attr
);
2012 session
= session_find_by_name(session_name
);
2014 ret
= LTTNG_ERR_SESS_NOT_FOUND
;
2018 session_lock(session
);
2019 ret
= save_session(session
, attr
, creds
);
2020 session_unlock(session
);
2025 struct ltt_session_list
*list
= session_get_list();
2027 cds_list_for_each_entry(session
, &list
->head
, list
) {
2028 session_lock(session
);
2029 ret
= save_session(session
, attr
, creds
);
2030 session_unlock(session
);
2032 /* Don't abort if we don't have the required permissions. */
2033 if (ret
&& ret
!= LTTNG_ERR_EPERM
) {
2041 session_unlock_list();