X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fsave.c;h=249d3030254e58f1883d06f9aebab09ecf3dfc1e;hp=c0684711ac9c818ea43a13d2945c4f168c1d876b;hb=997a03aacc9c43aaa4c2d8ca68a0337300891077;hpb=9d82c4c2efc657618039baf1b9150f82b388ca96 diff --git a/src/bin/lttng-sessiond/save.c b/src/bin/lttng-sessiond/save.c index c0684711a..249d30302 100644 --- a/src/bin/lttng-sessiond/save.c +++ b/src/bin/lttng-sessiond/save.c @@ -1,18 +1,8 @@ /* - * Copyright (C) 2014 - Jérémie Galarneau + * Copyright (C) 2014 Jérémie Galarneau * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License, version 2 only, as - * published by the Free Software Foundation. + * SPDX-License-Identifier: GPL-2.0-only * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., 51 - * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #define _LGPL_SOURCE @@ -36,6 +26,7 @@ #include "trace-ust.h" #include "agent.h" +/* Return LTTNG_OK on success else a LTTNG_ERR* code. */ static int save_kernel_channel_attributes(struct config_writer *writer, struct lttng_channel_attr *attr) @@ -47,12 +38,14 @@ int save_kernel_channel_attributes(struct config_writer *writer, attr->overwrite ? config_overwrite_mode_overwrite : config_overwrite_mode_discard); if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } ret = config_writer_write_element_unsigned_int(writer, config_element_subbuf_size, attr->subbuf_size); if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } @@ -60,6 +53,7 @@ int save_kernel_channel_attributes(struct config_writer *writer, config_element_num_subbuf, attr->num_subbuf); if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } @@ -67,6 +61,7 @@ int save_kernel_channel_attributes(struct config_writer *writer, config_element_switch_timer_interval, attr->switch_timer_interval); if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } @@ -74,6 +69,7 @@ int save_kernel_channel_attributes(struct config_writer *writer, config_element_read_timer_interval, attr->read_timer_interval); if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } @@ -82,12 +78,14 @@ int save_kernel_channel_attributes(struct config_writer *writer, attr->output == LTTNG_EVENT_SPLICE ? config_output_type_splice : config_output_type_mmap); if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } ret = config_writer_write_element_unsigned_int(writer, config_element_tracefile_size, attr->tracefile_size); if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } @@ -95,6 +93,7 @@ int save_kernel_channel_attributes(struct config_writer *writer, config_element_tracefile_count, attr->tracefile_count); if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } @@ -102,6 +101,7 @@ int save_kernel_channel_attributes(struct config_writer *writer, config_element_live_timer_interval, attr->live_timer_interval); if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } @@ -113,6 +113,7 @@ int save_kernel_channel_attributes(struct config_writer *writer, config_element_monitor_timer_interval, ext->monitor_timer_interval); if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } @@ -120,17 +121,20 @@ int save_kernel_channel_attributes(struct config_writer *writer, config_element_blocking_timeout, ext->blocking_timeout); if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } } + ret = LTTNG_OK; end: - return ret ? LTTNG_ERR_SAVE_IO_FAIL : 0; + return ret; } +/* Return LTTNG_OK on success else a LTTNG_ERR* code. */ static int save_ust_channel_attributes(struct config_writer *writer, - struct lttng_ust_channel_attr *attr) + struct lttng_ust_abi_channel_attr *attr) { int ret; struct ltt_ust_channel *channel = NULL; @@ -140,12 +144,14 @@ int save_ust_channel_attributes(struct config_writer *writer, attr->overwrite ? config_overwrite_mode_overwrite : config_overwrite_mode_discard); if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } ret = config_writer_write_element_unsigned_int(writer, config_element_subbuf_size, attr->subbuf_size); if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } @@ -153,6 +159,7 @@ int save_ust_channel_attributes(struct config_writer *writer, config_element_num_subbuf, attr->num_subbuf); if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } @@ -160,6 +167,7 @@ int save_ust_channel_attributes(struct config_writer *writer, config_element_switch_timer_interval, attr->switch_timer_interval); if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } @@ -167,14 +175,16 @@ int save_ust_channel_attributes(struct config_writer *writer, config_element_read_timer_interval, attr->read_timer_interval); if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } ret = config_writer_write_element_string(writer, config_element_output_type, - attr->output == LTTNG_UST_MMAP ? + attr->output == LTTNG_UST_ABI_MMAP ? config_output_type_mmap : config_output_type_splice); if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } @@ -182,6 +192,7 @@ int save_ust_channel_attributes(struct config_writer *writer, config_element_blocking_timeout, attr->u.s.blocking_timeout); if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } @@ -194,11 +205,13 @@ int save_ust_channel_attributes(struct config_writer *writer, config_element_monitor_timer_interval, channel->monitor_timer_interval); if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } + ret = LTTNG_OK; end: - return ret ? LTTNG_ERR_SAVE_IO_FAIL : 0; + return ret; } static @@ -294,6 +307,66 @@ const char *get_kernel_context_type_string( case LTTNG_KERNEL_CONTEXT_CALLSTACK_KERNEL: context_type_string = config_event_context_callstack_kernel; break; + case LTTNG_KERNEL_CONTEXT_CGROUP_NS: + context_type_string = config_event_context_cgroup_ns; + break; + case LTTNG_KERNEL_CONTEXT_IPC_NS: + context_type_string = config_event_context_ipc_ns; + break; + case LTTNG_KERNEL_CONTEXT_MNT_NS: + context_type_string = config_event_context_mnt_ns; + break; + case LTTNG_KERNEL_CONTEXT_NET_NS: + context_type_string = config_event_context_net_ns; + break; + case LTTNG_KERNEL_CONTEXT_PID_NS: + context_type_string = config_event_context_pid_ns; + break; + case LTTNG_KERNEL_CONTEXT_TIME_NS: + context_type_string = config_event_context_time_ns; + break; + case LTTNG_KERNEL_CONTEXT_USER_NS: + context_type_string = config_event_context_user_ns; + break; + case LTTNG_KERNEL_CONTEXT_UTS_NS: + context_type_string = config_event_context_uts_ns; + break; + case LTTNG_KERNEL_CONTEXT_UID: + context_type_string = config_event_context_uid; + break; + case LTTNG_KERNEL_CONTEXT_EUID: + context_type_string = config_event_context_euid; + break; + case LTTNG_KERNEL_CONTEXT_SUID: + context_type_string = config_event_context_suid; + break; + case LTTNG_KERNEL_CONTEXT_GID: + context_type_string = config_event_context_gid; + break; + case LTTNG_KERNEL_CONTEXT_EGID: + context_type_string = config_event_context_egid; + break; + case LTTNG_KERNEL_CONTEXT_SGID: + context_type_string = config_event_context_sgid; + break; + case LTTNG_KERNEL_CONTEXT_VUID: + context_type_string = config_event_context_vuid; + break; + case LTTNG_KERNEL_CONTEXT_VEUID: + context_type_string = config_event_context_veuid; + break; + case LTTNG_KERNEL_CONTEXT_VSUID: + context_type_string = config_event_context_vsuid; + break; + case LTTNG_KERNEL_CONTEXT_VGID: + context_type_string = config_event_context_vgid; + break; + case LTTNG_KERNEL_CONTEXT_VEGID: + context_type_string = config_event_context_vegid; + break; + case LTTNG_KERNEL_CONTEXT_VSGID: + context_type_string = config_event_context_vsgid; + break; default: context_type_string = NULL; } @@ -303,30 +376,72 @@ const char *get_kernel_context_type_string( static const char *get_ust_context_type_string( - enum lttng_ust_context_type context_type) + enum lttng_ust_abi_context_type context_type) { const char *context_type_string; switch (context_type) { - case LTTNG_UST_CONTEXT_PROCNAME: + case LTTNG_UST_ABI_CONTEXT_PROCNAME: context_type_string = config_event_context_procname; break; - case LTTNG_UST_CONTEXT_VPID: + case LTTNG_UST_ABI_CONTEXT_VPID: context_type_string = config_event_context_vpid; break; - case LTTNG_UST_CONTEXT_VTID: + case LTTNG_UST_ABI_CONTEXT_VTID: context_type_string = config_event_context_vtid; break; - case LTTNG_UST_CONTEXT_IP: + case LTTNG_UST_ABI_CONTEXT_IP: context_type_string = config_event_context_ip; break; - case LTTNG_UST_CONTEXT_PTHREAD_ID: + case LTTNG_UST_ABI_CONTEXT_PTHREAD_ID: context_type_string = config_event_context_pthread_id; break; - case LTTNG_UST_CONTEXT_APP_CONTEXT: + case LTTNG_UST_ABI_CONTEXT_APP_CONTEXT: context_type_string = config_event_context_app; break; - case LTTNG_UST_CONTEXT_PERF_THREAD_COUNTER: + case LTTNG_UST_ABI_CONTEXT_CGROUP_NS: + context_type_string = config_event_context_cgroup_ns; + break; + case LTTNG_UST_ABI_CONTEXT_IPC_NS: + context_type_string = config_event_context_ipc_ns; + break; + case LTTNG_UST_ABI_CONTEXT_MNT_NS: + context_type_string = config_event_context_mnt_ns; + break; + case LTTNG_UST_ABI_CONTEXT_NET_NS: + context_type_string = config_event_context_net_ns; + break; + case LTTNG_UST_ABI_CONTEXT_TIME_NS: + context_type_string = config_event_context_time_ns; + break; + case LTTNG_UST_ABI_CONTEXT_PID_NS: + context_type_string = config_event_context_pid_ns; + break; + case LTTNG_UST_ABI_CONTEXT_USER_NS: + context_type_string = config_event_context_user_ns; + break; + case LTTNG_UST_ABI_CONTEXT_UTS_NS: + context_type_string = config_event_context_uts_ns; + break; + case LTTNG_UST_ABI_CONTEXT_VUID: + context_type_string = config_event_context_vuid; + break; + case LTTNG_UST_ABI_CONTEXT_VEUID: + context_type_string = config_event_context_veuid; + break; + case LTTNG_UST_ABI_CONTEXT_VSUID: + context_type_string = config_event_context_vsuid; + break; + case LTTNG_UST_ABI_CONTEXT_VGID: + context_type_string = config_event_context_vgid; + break; + case LTTNG_UST_ABI_CONTEXT_VEGID: + context_type_string = config_event_context_vegid; + break; + case LTTNG_UST_ABI_CONTEXT_VSGID: + context_type_string = config_event_context_vsgid; + break; + case LTTNG_UST_ABI_CONTEXT_PERF_THREAD_COUNTER: /* * Error, should not be stored in the XML, perf contexts * are stored as a node of type event_perf_context_type. @@ -364,18 +479,18 @@ const char *get_buffer_type_string( static const char *get_loglevel_type_string( - enum lttng_ust_loglevel_type loglevel_type) + enum lttng_ust_abi_loglevel_type loglevel_type) { const char *loglevel_type_string; switch (loglevel_type) { - case LTTNG_UST_LOGLEVEL_ALL: + case LTTNG_UST_ABI_LOGLEVEL_ALL: loglevel_type_string = config_loglevel_type_all; break; - case LTTNG_UST_LOGLEVEL_RANGE: + case LTTNG_UST_ABI_LOGLEVEL_RANGE: loglevel_type_string = config_loglevel_type_range; break; - case LTTNG_UST_LOGLEVEL_SINGLE: + case LTTNG_UST_ABI_LOGLEVEL_SINGLE: loglevel_type_string = config_loglevel_type_single; break; default: @@ -385,6 +500,7 @@ const char *get_loglevel_type_string( return loglevel_type_string; } +/* Return LTTNG_OK on success else a LTTNG_ERR* code. */ static int save_kernel_function_event(struct config_writer *writer, struct ltt_kernel_event *event) @@ -504,8 +620,8 @@ int save_kernel_userspace_probe_tracepoint_event(struct config_writer *writer, { int ret = 0; const char *probe_name, *provider_name, *binary_path; - struct lttng_userspace_probe_location *userspace_probe_location; - struct lttng_userspace_probe_location_lookup_method *lookup_method; + const struct lttng_userspace_probe_location *userspace_probe_location; + const struct lttng_userspace_probe_location_lookup_method *lookup_method; enum lttng_userspace_probe_location_lookup_method_type lookup_type; /* Get userspace probe location from the event. */ @@ -618,8 +734,8 @@ int save_kernel_userspace_probe_function_event(struct config_writer *writer, { int ret = 0; const char *function_name, *binary_path; - struct lttng_userspace_probe_location *userspace_probe_location; - struct lttng_userspace_probe_location_lookup_method *lookup_method; + const struct lttng_userspace_probe_location *userspace_probe_location; + const struct lttng_userspace_probe_location_lookup_method *lookup_method; enum lttng_userspace_probe_location_lookup_method_type lookup_type; /* Get userspace probe location from the event. */ @@ -866,10 +982,13 @@ int save_kernel_event(struct config_writer *writer, ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } + + ret = LTTNG_OK; end: return ret; } +/* Return LTTNG_OK on success else a LTTNG_ERR* code. */ static int save_kernel_events(struct config_writer *writer, struct ltt_kernel_channel *kchan) @@ -885,7 +1004,7 @@ int save_kernel_events(struct config_writer *writer, cds_list_for_each_entry(event, &kchan->events_list.head, list) { ret = save_kernel_event(writer, event); - if (ret) { + if (ret != LTTNG_OK) { goto end; } } @@ -896,10 +1015,13 @@ int save_kernel_events(struct config_writer *writer, ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } + + ret = LTTNG_OK; end: return ret; } +/* Return LTTNG_OK on success else a LTTNG_ERR* code. */ static int save_ust_event(struct config_writer *writer, struct ltt_ust_event *event) @@ -929,7 +1051,7 @@ int save_ust_event(struct config_writer *writer, goto end; } - if (event->attr.instrumentation != LTTNG_UST_TRACEPOINT) { + if (event->attr.instrumentation != LTTNG_UST_ABI_TRACEPOINT) { ERR("Unsupported UST instrumentation type."); ret = LTTNG_ERR_INVALID; goto end; @@ -957,7 +1079,7 @@ int save_ust_event(struct config_writer *writer, } /* The log level is irrelevant if no "filtering" is enabled */ - if (event->attr.loglevel_type != LTTNG_UST_LOGLEVEL_ALL) { + if (event->attr.loglevel_type != LTTNG_UST_ABI_LOGLEVEL_ALL) { ret = config_writer_write_element_signed_int(writer, config_element_loglevel, event->attr.loglevel); if (ret) { @@ -1010,10 +1132,13 @@ int save_ust_event(struct config_writer *writer, ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } + + ret = LTTNG_OK; end: return ret; } +/* Return LTTNG_OK on success else a LTTNG_ERR* code. */ static int save_ust_events(struct config_writer *writer, struct lttng_ht *events) @@ -1038,7 +1163,7 @@ int save_ust_events(struct config_writer *writer, continue; } ret = save_ust_event(writer, event); - if (ret) { + if (ret != LTTNG_OK) { rcu_read_unlock(); goto end; } @@ -1051,37 +1176,40 @@ int save_ust_events(struct config_writer *writer, ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } + + ret = LTTNG_OK; end: return ret; } +/* Return LTTNG_OK on success else a LTTNG_ERR* code. */ static int init_ust_event_from_agent_event(struct ltt_ust_event *ust_event, struct agent_event *agent_event) { - int ret = 0; - enum lttng_ust_loglevel_type ust_loglevel_type; + int ret; + enum lttng_ust_abi_loglevel_type ust_loglevel_type; - ust_event->enabled = agent_event->enabled; - ust_event->attr.instrumentation = LTTNG_UST_TRACEPOINT; + ust_event->enabled = AGENT_EVENT_IS_ENABLED(agent_event); + ust_event->attr.instrumentation = LTTNG_UST_ABI_TRACEPOINT; if (lttng_strncpy(ust_event->attr.name, agent_event->name, LTTNG_SYMBOL_NAME_LEN)) { - ret = -1; + ret = LTTNG_ERR_INVALID; goto end; } switch (agent_event->loglevel_type) { case LTTNG_EVENT_LOGLEVEL_ALL: - ust_loglevel_type = LTTNG_UST_LOGLEVEL_ALL; + ust_loglevel_type = LTTNG_UST_ABI_LOGLEVEL_ALL; break; case LTTNG_EVENT_LOGLEVEL_SINGLE: - ust_loglevel_type = LTTNG_UST_LOGLEVEL_SINGLE; + ust_loglevel_type = LTTNG_UST_ABI_LOGLEVEL_SINGLE; break; case LTTNG_EVENT_LOGLEVEL_RANGE: - ust_loglevel_type = LTTNG_UST_LOGLEVEL_RANGE; + ust_loglevel_type = LTTNG_UST_ABI_LOGLEVEL_RANGE; break; default: ERR("Invalid agent_event loglevel_type."); - ret = -1; + ret = LTTNG_ERR_INVALID; goto end; } @@ -1089,10 +1217,13 @@ int init_ust_event_from_agent_event(struct ltt_ust_event *ust_event, ust_event->attr.loglevel = agent_event->loglevel_value; ust_event->filter_expression = agent_event->filter_expression; ust_event->exclusion = agent_event->exclusion; + + ret = LTTNG_OK; end: return ret; } +/* Return LTTNG_OK on success else a LTTNG_ERR* code. */ static int save_agent_events(struct config_writer *writer, struct agent *agent) @@ -1109,7 +1240,6 @@ int save_agent_events(struct config_writer *writer, rcu_read_lock(); cds_lfht_for_each_entry(agent->events->ht, &iter.iter, node, node) { - int ret; struct agent_event *agent_event; struct ltt_ust_event fake_event; @@ -1123,12 +1253,12 @@ int save_agent_events(struct config_writer *writer, * structures...). */ ret = init_ust_event_from_agent_event(&fake_event, agent_event); - if (ret) { + if (ret != LTTNG_OK) { rcu_read_unlock(); goto end; } ret = save_ust_event(writer, &fake_event); - if (ret) { + if (ret != LTTNG_OK) { rcu_read_unlock(); goto end; } @@ -1141,15 +1271,18 @@ int save_agent_events(struct config_writer *writer, ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } + + ret = LTTNG_OK; end: return ret; } +/* Return LTTNG_OK on success else a LTTNG_ERR* code. */ static int save_kernel_context(struct config_writer *writer, struct lttng_kernel_context *ctx) { - int ret = 0; + int ret = LTTNG_OK; if (!ctx) { goto end; @@ -1221,10 +1354,12 @@ int save_kernel_context(struct config_writer *writer, goto end; } + ret = LTTNG_OK; end: return ret; } +/* Return LTTNG_OK on success else a LTTNG_ERR* code. */ static int save_kernel_contexts(struct config_writer *writer, struct ltt_kernel_channel *kchan) @@ -1233,7 +1368,7 @@ int save_kernel_contexts(struct config_writer *writer, struct ltt_kernel_context *ctx; if (cds_list_empty(&kchan->ctx_list)) { - ret = 0; + ret = LTTNG_OK; goto end; } @@ -1245,7 +1380,7 @@ int save_kernel_contexts(struct config_writer *writer, cds_list_for_each_entry(ctx, &kchan->ctx_list, list) { ret = save_kernel_context(writer, &ctx->ctx); - if (ret) { + if (ret != LTTNG_OK) { goto end; } } @@ -1256,10 +1391,13 @@ int save_kernel_contexts(struct config_writer *writer, ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } + + ret = LTTNG_OK; end: return ret; } +/* Return LTTNG_OK on success else a LTTNG_ERR* code. */ static int save_ust_context_perf_thread_counter(struct config_writer *writer, struct ltt_ust_context *ctx) @@ -1303,10 +1441,13 @@ int save_ust_context_perf_thread_counter(struct config_writer *writer, ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } + + ret = LTTNG_OK; end: return ret; } +/* Return LTTNG_OK on success else a LTTNG_ERR* code. */ static int save_ust_context_app_ctx(struct config_writer *writer, struct ltt_ust_context *ctx) @@ -1345,10 +1486,13 @@ int save_ust_context_app_ctx(struct config_writer *writer, ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } + + ret = LTTNG_OK; end: return ret; } +/* Return LTTNG_OK on success else a LTTNG_ERR* code. */ static int save_ust_context_generic(struct config_writer *writer, struct ltt_ust_context *ctx) @@ -1374,10 +1518,13 @@ int save_ust_context_generic(struct config_writer *writer, ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } + + ret = LTTNG_OK; end: return ret; } +/* Return LTTNG_OK on success else a LTTNG_ERR* code. */ static int save_ust_context(struct config_writer *writer, struct cds_list_head *ctx_list) @@ -1403,17 +1550,17 @@ int save_ust_context(struct config_writer *writer, } switch (ctx->ctx.ctx) { - case LTTNG_UST_CONTEXT_PERF_THREAD_COUNTER: + case LTTNG_UST_ABI_CONTEXT_PERF_THREAD_COUNTER: ret = save_ust_context_perf_thread_counter(writer, ctx); break; - case LTTNG_UST_CONTEXT_APP_CONTEXT: + case LTTNG_UST_ABI_CONTEXT_APP_CONTEXT: ret = save_ust_context_app_ctx(writer, ctx); break; default: /* Save generic context. */ ret = save_ust_context_generic(writer, ctx); } - if (ret) { + if (ret != LTTNG_OK) { goto end; } @@ -1431,10 +1578,13 @@ int save_ust_context(struct config_writer *writer, ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } + + ret = LTTNG_OK; end: return ret; } +/* Return LTTNG_OK on success else a LTTNG_ERR* code. */ static int save_kernel_channel(struct config_writer *writer, struct ltt_kernel_channel *kchan) @@ -1465,17 +1615,17 @@ int save_kernel_channel(struct config_writer *writer, } ret = save_kernel_channel_attributes(writer, &kchan->channel->attr); - if (ret) { + if (ret != LTTNG_OK) { goto end; } ret = save_kernel_events(writer, kchan); - if (ret) { + if (ret != LTTNG_OK) { goto end; } ret = save_kernel_contexts(writer, kchan); - if (ret) { + if (ret != LTTNG_OK) { goto end; } @@ -1485,10 +1635,13 @@ int save_kernel_channel(struct config_writer *writer, ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } + + ret = LTTNG_OK; end: return ret; } +/* Return LTTNG_OK on success else a LTTNG_ERR* code. */ static int save_ust_channel(struct config_writer *writer, struct ltt_ust_channel *ust_chan, @@ -1521,7 +1674,7 @@ int save_ust_channel(struct config_writer *writer, } ret = save_ust_channel_attributes(writer, &ust_chan->attr); - if (ret) { + if (ret != LTTNG_OK) { goto end; } @@ -1549,7 +1702,7 @@ int save_ust_channel(struct config_writer *writer, if (ust_chan->domain == LTTNG_DOMAIN_UST) { ret = save_ust_events(writer, ust_chan->events); - if (ret) { + if (ret != LTTNG_OK) { goto end; } } else { @@ -1569,13 +1722,13 @@ int save_ust_channel(struct config_writer *writer, * them. */ ret = save_agent_events(writer, agent); - if (ret) { + if (ret != LTTNG_OK) { goto end; } } ret = save_ust_context(writer, &ust_chan->ctx_list); - if (ret) { + if (ret != LTTNG_OK) { goto end; } @@ -1585,10 +1738,13 @@ int save_ust_channel(struct config_writer *writer, ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } + + ret = LTTNG_OK; end: return ret; } +/* Return LTTNG_OK on success else a LTTNG_ERR* code. */ static int save_kernel_session(struct config_writer *writer, struct ltt_session *session) @@ -1623,7 +1779,7 @@ int save_kernel_session(struct config_writer *writer, cds_list_for_each_entry(kchan, &session->kernel_session->channel_list.head, list) { ret = save_kernel_channel(writer, kchan); - if (ret) { + if (ret != LTTNG_OK) { goto end; } } @@ -1634,6 +1790,8 @@ int save_kernel_session(struct config_writer *writer, ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } + + ret = LTTNG_OK; end: return ret; } @@ -1666,99 +1824,260 @@ const char *get_config_domain_str(enum lttng_domain_type domain) return str_dom; } -static -int save_pid_tracker(struct config_writer *writer, - struct ltt_session *sess, int domain) +/* Return LTTNG_OK on success else a LTTNG_ERR* code. */ +static int save_process_attr_tracker(struct config_writer *writer, + struct ltt_session *sess, + int domain, + enum lttng_process_attr process_attr) { - int ret = 0; - ssize_t nr_pids = 0, i; - int32_t *pids = NULL; + int ret = LTTNG_OK; + const char *element_id_tracker, *element_target_id, *element_id; + const struct process_attr_tracker *tracker; + enum lttng_tracking_policy tracking_policy; + struct lttng_process_attr_values *values = NULL; + + switch (process_attr) { + case LTTNG_PROCESS_ATTR_PROCESS_ID: + element_id_tracker = config_element_process_attr_tracker_pid; + element_target_id = config_element_process_attr_pid_value; + element_id = config_element_process_attr_id; + break; + case LTTNG_PROCESS_ATTR_VIRTUAL_PROCESS_ID: + element_id_tracker = config_element_process_attr_tracker_vpid; + element_target_id = config_element_process_attr_vpid_value; + element_id = config_element_process_attr_id; + break; + case LTTNG_PROCESS_ATTR_USER_ID: + element_id_tracker = config_element_process_attr_tracker_uid; + element_target_id = config_element_process_attr_uid_value; + element_id = config_element_process_attr_id; + break; + case LTTNG_PROCESS_ATTR_VIRTUAL_USER_ID: + element_id_tracker = config_element_process_attr_tracker_vuid; + element_target_id = config_element_process_attr_vuid_value; + element_id = config_element_process_attr_id; + break; + case LTTNG_PROCESS_ATTR_GROUP_ID: + element_id_tracker = config_element_process_attr_tracker_gid; + element_target_id = config_element_process_attr_gid_value; + element_id = config_element_process_attr_id; + break; + case LTTNG_PROCESS_ATTR_VIRTUAL_GROUP_ID: + element_id_tracker = config_element_process_attr_tracker_vgid; + element_target_id = config_element_process_attr_vgid_value; + element_id = config_element_process_attr_id; + break; + default: + ret = LTTNG_ERR_SAVE_IO_FAIL; + goto end; + } switch (domain) { case LTTNG_DOMAIN_KERNEL: { - nr_pids = kernel_list_tracker_pids(sess->kernel_session, &pids); - if (nr_pids < 0) { - ret = LTTNG_ERR_KERN_LIST_FAIL; - goto end; - } + tracker = kernel_get_process_attr_tracker( + sess->kernel_session, process_attr); + assert(tracker); break; } case LTTNG_DOMAIN_UST: { - nr_pids = trace_ust_list_tracker_pids(sess->ust_session, &pids); - if (nr_pids < 0) { - ret = LTTNG_ERR_UST_LIST_FAIL; - goto end; - } + tracker = trace_ust_get_process_attr_tracker( + sess->ust_session, process_attr); + assert(tracker); break; } case LTTNG_DOMAIN_JUL: case LTTNG_DOMAIN_LOG4J: case LTTNG_DOMAIN_PYTHON: default: - ret = LTTNG_ERR_UNKNOWN_DOMAIN; + ret = LTTNG_ERR_UNSUPPORTED_DOMAIN; goto end; } - /* Only create a pid_tracker if enabled or untrack all */ - if (nr_pids != 1 || (nr_pids == 1 && pids[0] != -1)) { - ret = config_writer_open_element(writer, - config_element_pid_tracker); - if (ret) { - ret = LTTNG_ERR_SAVE_IO_FAIL; - goto end; - } + tracking_policy = process_attr_tracker_get_tracking_policy(tracker); + if (tracking_policy == LTTNG_TRACKING_POLICY_INCLUDE_ALL) { + /* Tracking all, nothing to output. */ + ret = LTTNG_OK; + goto end; + } - ret = config_writer_open_element(writer, - config_element_targets); - if (ret) { - ret = LTTNG_ERR_SAVE_IO_FAIL; + ret = config_writer_open_element(writer, element_id_tracker); + if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; + goto end; + } + + ret = config_writer_open_element( + writer, config_element_process_attr_values); + if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; + goto end; + } + + if (tracking_policy == LTTNG_TRACKING_POLICY_INCLUDE_SET) { + unsigned int i, count; + enum process_attr_tracker_status status = + process_attr_tracker_get_inclusion_set( + tracker, &values); + + if (status != PROCESS_ATTR_TRACKER_STATUS_OK) { + ret = LTTNG_ERR_NOMEM; goto end; } - for (i = 0; i < nr_pids; i++) { - ret = config_writer_open_element(writer, - config_element_target_pid); + count = _lttng_process_attr_values_get_count(values); + + for (i = 0; i < count; i++) { + unsigned int integral_value = UINT_MAX; + const char *name = NULL; + const struct process_attr_value *value = + lttng_process_attr_tracker_values_get_at_index( + values, i); + + assert(value); + ret = config_writer_open_element( + writer, element_target_id); if (ret) { ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } - ret = config_writer_write_element_unsigned_int(writer, - config_element_pid, pids[i]); + switch (value->type) { + case LTTNG_PROCESS_ATTR_VALUE_TYPE_PID: + integral_value = + (unsigned int) value->value.pid; + break; + case LTTNG_PROCESS_ATTR_VALUE_TYPE_UID: + integral_value = + (unsigned int) value->value.uid; + break; + case LTTNG_PROCESS_ATTR_VALUE_TYPE_GID: + integral_value = + (unsigned int) value->value.gid; + break; + case LTTNG_PROCESS_ATTR_VALUE_TYPE_USER_NAME: + name = value->value.user_name; + assert(name); + break; + case LTTNG_PROCESS_ATTR_VALUE_TYPE_GROUP_NAME: + name = value->value.group_name; + assert(name); + break; + default: + abort(); + } + + if (name) { + ret = config_writer_write_element_string(writer, + config_element_name, name); + } else { + ret = config_writer_write_element_unsigned_int( + writer, element_id, + integral_value); + } + if (ret) { ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } - /* /pid_target */ + /* /$element_target_id */ ret = config_writer_close_element(writer); if (ret) { ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } } + } - /* /targets */ - ret = config_writer_close_element(writer); - if (ret) { - ret = LTTNG_ERR_SAVE_IO_FAIL; + /* /values */ + ret = config_writer_close_element(writer); + if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; + goto end; + } + + /* /$element_id_tracker */ + ret = config_writer_close_element(writer); + if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; + goto end; + } + + ret = LTTNG_OK; +end: + lttng_process_attr_values_destroy(values); + return ret; +} + +/* Return LTTNG_OK on success else a LTTNG_ERR* code. */ +static int save_process_attr_trackers(struct config_writer *writer, + struct ltt_session *sess, + int domain) +{ + int ret; + + switch (domain) { + case LTTNG_DOMAIN_KERNEL: + ret = save_process_attr_tracker(writer, sess, domain, + LTTNG_PROCESS_ATTR_PROCESS_ID); + if (ret != LTTNG_OK) { goto end; } - - /* /pid_tracker */ - ret = config_writer_close_element(writer); - if (ret) { - ret = LTTNG_ERR_SAVE_IO_FAIL; + ret = save_process_attr_tracker(writer, sess, domain, + LTTNG_PROCESS_ATTR_VIRTUAL_PROCESS_ID); + if (ret != LTTNG_OK) { + goto end; + } + ret = save_process_attr_tracker(writer, sess, domain, + LTTNG_PROCESS_ATTR_USER_ID); + if (ret != LTTNG_OK) { goto end; } + ret = save_process_attr_tracker(writer, sess, domain, + LTTNG_PROCESS_ATTR_VIRTUAL_USER_ID); + if (ret != LTTNG_OK) { + goto end; + } + ret = save_process_attr_tracker(writer, sess, domain, + LTTNG_PROCESS_ATTR_GROUP_ID); + if (ret != LTTNG_OK) { + goto end; + } + ret = save_process_attr_tracker(writer, sess, domain, + LTTNG_PROCESS_ATTR_VIRTUAL_GROUP_ID); + if (ret != LTTNG_OK) { + goto end; + } + break; + case LTTNG_DOMAIN_UST: + ret = save_process_attr_tracker(writer, sess, domain, + LTTNG_PROCESS_ATTR_VIRTUAL_PROCESS_ID); + if (ret != LTTNG_OK) { + goto end; + } + ret = save_process_attr_tracker(writer, sess, domain, + LTTNG_PROCESS_ATTR_VIRTUAL_USER_ID); + if (ret != LTTNG_OK) { + goto end; + } + ret = save_process_attr_tracker(writer, sess, domain, + LTTNG_PROCESS_ATTR_VIRTUAL_GROUP_ID); + if (ret != LTTNG_OK) { + goto end; + } + break; + default: + ret = LTTNG_ERR_INVALID; + goto end; } + ret = LTTNG_OK; end: - free(pids); return ret; } +/* Return LTTNG_OK on success else a LTTNG_ERR* code. */ static int save_ust_domain(struct config_writer *writer, struct ltt_session *session, enum lttng_domain_type domain) @@ -1820,7 +2139,7 @@ int save_ust_domain(struct config_writer *writer, ust_chan = caa_container_of(node, struct ltt_ust_channel, node); if (domain == ust_chan->domain) { ret = save_ust_channel(writer, ust_chan, session->ust_session); - if (ret) { + if (ret != LTTNG_OK) { rcu_read_unlock(); goto end; } @@ -1836,21 +2155,23 @@ int save_ust_domain(struct config_writer *writer, } if (domain == LTTNG_DOMAIN_UST) { - ret = config_writer_open_element(writer, - config_element_trackers); + ret = config_writer_open_element( + writer, config_element_process_attr_trackers); if (ret) { ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } - ret = save_pid_tracker(writer, session, LTTNG_DOMAIN_UST); - if (ret) { + ret = save_process_attr_trackers( + writer, session, LTTNG_DOMAIN_UST); + if (ret != LTTNG_OK) { goto end; } /* /trackers */ ret = config_writer_close_element(writer); if (ret) { + ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } } @@ -1862,14 +2183,16 @@ int save_ust_domain(struct config_writer *writer, goto end; } + ret = LTTNG_OK; end: return ret; } +/* Return LTTNG_OK on success else a LTTNG_ERR* code. */ static int save_domains(struct config_writer *writer, struct ltt_session *session) { - int ret = 0; + int ret = LTTNG_OK; assert(writer); assert(session); @@ -1884,7 +2207,6 @@ int save_domains(struct config_writer *writer, struct ltt_session *session) goto end; } - if (session->kernel_session) { ret = config_writer_open_element(writer, config_element_domain); @@ -1894,19 +2216,20 @@ int save_domains(struct config_writer *writer, struct ltt_session *session) } ret = save_kernel_session(writer, session); - if (ret) { + if (ret != LTTNG_OK) { goto end; } - ret = config_writer_open_element(writer, - config_element_trackers); + ret = config_writer_open_element( + writer, config_element_process_attr_trackers); if (ret) { ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } - ret = save_pid_tracker(writer, session, LTTNG_DOMAIN_KERNEL); - if (ret) { + ret = save_process_attr_trackers( + writer, session, LTTNG_DOMAIN_KERNEL); + if (ret != LTTNG_OK) { goto end; } @@ -1926,22 +2249,22 @@ int save_domains(struct config_writer *writer, struct ltt_session *session) if (session->ust_session) { ret = save_ust_domain(writer, session, LTTNG_DOMAIN_UST); - if (ret) { + if (ret != LTTNG_OK) { goto end; } ret = save_ust_domain(writer, session, LTTNG_DOMAIN_JUL); - if (ret) { + if (ret != LTTNG_OK) { goto end; } ret = save_ust_domain(writer, session, LTTNG_DOMAIN_LOG4J); - if (ret) { + if (ret != LTTNG_OK) { goto end; } ret = save_ust_domain(writer, session, LTTNG_DOMAIN_PYTHON); - if (ret) { + if (ret != LTTNG_OK) { goto end; } } @@ -1952,10 +2275,13 @@ int save_domains(struct config_writer *writer, struct ltt_session *session) ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } + + ret = LTTNG_OK; end: return ret; } +/* Return LTTNG_OK on success else a LTTNG_ERR* code. */ static int save_consumer_output(struct config_writer *writer, struct consumer_output *output) @@ -2036,10 +2362,10 @@ int save_consumer_output(struct config_writer *writer, ret = LTTNG_ERR_SAVE_IO_FAIL; goto end_net_output; } - + ret = LTTNG_OK; end_net_output: free(uri); - if (ret) { + if (ret != LTTNG_OK) { goto end; } } else { @@ -2076,10 +2402,13 @@ end_net_output: ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } + + ret = LTTNG_OK; end: return ret; } +/* Return LTTNG_OK on success else a LTTNG_ERR* code. */ static int save_snapshot_outputs(struct config_writer *writer, struct snapshot *snapshot) @@ -2122,7 +2451,7 @@ int save_snapshot_outputs(struct config_writer *writer, } ret = save_consumer_output(writer, output->consumer); - if (ret) { + if (ret != LTTNG_OK) { goto end_unlock; } @@ -2142,6 +2471,7 @@ int save_snapshot_outputs(struct config_writer *writer, goto end; } + ret = LTTNG_OK; end: return ret; end_unlock: @@ -2149,6 +2479,7 @@ end_unlock: return ret; } +/* Return LTTNG_OK on success else a LTTNG_ERR* code. */ static int save_session_output(struct config_writer *writer, struct ltt_session *session) @@ -2161,7 +2492,7 @@ int save_session_output(struct config_writer *writer, if ((session->snapshot_mode && session->snapshot.nb_output == 0) || (!session->snapshot_mode && !session->consumer)) { /* Session is in no output mode */ - ret = 0; + ret = LTTNG_OK; goto end; } @@ -2173,13 +2504,13 @@ int save_session_output(struct config_writer *writer, if (session->snapshot_mode) { ret = save_snapshot_outputs(writer, &session->snapshot); - if (ret) { + if (ret != LTTNG_OK) { goto end; } } else { if (session->consumer) { ret = save_consumer_output(writer, session->consumer); - if (ret) { + if (ret != LTTNG_OK) { goto end; } } @@ -2191,6 +2522,7 @@ int save_session_output(struct config_writer *writer, ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } + ret = LTTNG_OK; end: return ret; } @@ -2245,6 +2577,9 @@ int save_session_rotation_schedules(struct config_writer *writer, ret = config_writer_open_element(writer, config_element_rotation_schedules); + if (ret) { + goto end; + } if (session->rotate_timer_period) { ret = save_session_rotation_schedule(writer, LTTNG_ROTATION_SCHEDULE_TYPE_PERIODIC, @@ -2275,19 +2610,19 @@ end: /* * Save the given session. * - * Return 0 on success else a LTTNG_ERR* code. + * Return LTTNG_OK on success else a LTTNG_ERR* code. */ static int save_session(struct ltt_session *session, struct lttng_save_session_attr *attr, lttng_sock_cred *creds) { - int ret, fd; - unsigned int file_opened = 0; /* Indicate if the file has been opened */ - char config_file_path[PATH_MAX]; + int ret, fd = -1; + char config_file_path[LTTNG_PATH_MAX]; size_t len; struct config_writer *writer = NULL; size_t session_name_len; const char *provided_path; + int file_open_flags = O_CREAT | O_WRONLY | O_TRUNC; assert(session); assert(attr); @@ -2297,8 +2632,7 @@ int save_session(struct ltt_session *session, memset(config_file_path, 0, sizeof(config_file_path)); if (!session_access_ok(session, - LTTNG_SOCK_GET_UID_CRED(creds), - LTTNG_SOCK_GET_GID_CRED(creds))) { + LTTNG_SOCK_GET_UID_CRED(creds)) || session->destroyed) { ret = LTTNG_ERR_EPERM; goto end; } @@ -2311,7 +2645,7 @@ int save_session(struct ltt_session *session, ret = LTTNG_ERR_SET_URL; goto end; } - strncpy(config_file_path, provided_path, len); + strncpy(config_file_path, provided_path, sizeof(config_file_path)); } else { ssize_t ret_len; char *home_dir = utils_get_user_home_dir( @@ -2355,27 +2689,34 @@ int save_session(struct ltt_session *session, * was done just above. */ config_file_path[len++] = '/'; - strncpy(config_file_path + len, session->name, session_name_len); + strncpy(config_file_path + len, session->name, sizeof(config_file_path) - len); len += session_name_len; strcpy(config_file_path + len, DEFAULT_SESSION_CONFIG_FILE_EXTENSION); len += sizeof(DEFAULT_SESSION_CONFIG_FILE_EXTENSION); config_file_path[len] = '\0'; - if (!access(config_file_path, F_OK) && !attr->overwrite) { - /* File exists, notify the user since the overwrite flag is off. */ - ret = LTTNG_ERR_SAVE_FILE_EXIST; - goto end; + if (!attr->overwrite) { + file_open_flags |= O_EXCL; } - fd = run_as_open(config_file_path, O_CREAT | O_WRONLY | O_TRUNC, + fd = run_as_open(config_file_path, file_open_flags, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP, LTTNG_SOCK_GET_UID_CRED(creds), LTTNG_SOCK_GET_GID_CRED(creds)); if (fd < 0) { PERROR("Could not create configuration file"); - ret = LTTNG_ERR_SAVE_IO_FAIL; + switch (errno) { + case EEXIST: + ret = LTTNG_ERR_SAVE_FILE_EXIST; + break; + case EACCES: + ret = LTTNG_ERR_EPERM; + break; + default: + ret = LTTNG_ERR_SAVE_IO_FAIL; + break; + } goto end; } - file_opened = 1; writer = config_writer_create(fd, 1); if (!writer) { @@ -2402,7 +2743,7 @@ int save_session(struct ltt_session *session, goto end; } - if(session->shm_path[0] != '\0') { + if (session->shm_path[0] != '\0') { ret = config_writer_write_element_string(writer, config_element_shared_memory_path, session->shm_path); @@ -2413,7 +2754,7 @@ int save_session(struct ltt_session *session, } ret = save_domains(writer, session); - if (ret) { + if (ret != LTTNG_OK) { goto end; } @@ -2465,7 +2806,7 @@ int save_session(struct ltt_session *session, } ret = save_session_output(writer, session); - if (ret) { + if (ret != LTTNG_OK) { goto end; } @@ -2482,21 +2823,25 @@ int save_session(struct ltt_session *session, ret = LTTNG_ERR_SAVE_IO_FAIL; goto end; } + + ret = LTTNG_OK; end: if (writer && config_writer_destroy(writer)) { /* Preserve the original error code */ - ret = ret ? ret : LTTNG_ERR_SAVE_IO_FAIL; + ret = ret != LTTNG_OK ? ret : LTTNG_ERR_SAVE_IO_FAIL; } - if (ret) { + if (ret != LTTNG_OK) { /* Delete file in case of error */ - if (file_opened && unlink(config_file_path)) { + if ((fd >= 0) && unlink(config_file_path)) { PERROR("Unlinking XML session configuration."); } } - if (file_opened) { - ret = close(fd); - if (ret) { + if (fd >= 0) { + int closeret; + + closeret = close(fd); + if (closeret) { PERROR("Closing XML session configuration"); } } @@ -2524,19 +2869,23 @@ int cmd_save_sessions(struct lttng_save_session_attr *attr, session_lock(session); ret = save_session(session, attr, creds); session_unlock(session); - if (ret) { + session_put(session); + if (ret != LTTNG_OK) { goto end; } } else { struct ltt_session_list *list = session_get_list(); cds_list_for_each_entry(session, &list->head, list) { + if (!session_get(session)) { + continue; + } session_lock(session); ret = save_session(session, attr, creds); session_unlock(session); - + session_put(session); /* Don't abort if we don't have the required permissions. */ - if (ret && ret != LTTNG_ERR_EPERM) { + if (ret != LTTNG_OK && ret != LTTNG_ERR_EPERM) { goto end; } }