Fix: sessiond: don't negate error code on list error
[lttng-tools.git] / src / bin / lttng-sessiond / cmd.c
CommitLineData
2f77fc4b
DG
1/*
2 * Copyright (C) 2012 - David Goulet <dgoulet@efficios.com>
bdf64013 3 * Copyright (C) 2016 - Jérémie Galarneau <jeremie.galarneau@efficios.com>
2f77fc4b
DG
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
6c1c0768 19#define _LGPL_SOURCE
2f77fc4b 20#include <assert.h>
6dc3064a 21#include <inttypes.h>
2f77fc4b
DG
22#include <urcu/list.h>
23#include <urcu/uatomic.h>
a503e1ef 24#include <sys/stat.h>
e5148e25 25#include <stdio.h>
2f77fc4b
DG
26
27#include <common/defaults.h>
28#include <common/common.h>
29#include <common/sessiond-comm/sessiond-comm.h>
30#include <common/relayd/relayd.h>
10a50311 31#include <common/utils.h>
f5436bfc 32#include <common/compat/string.h>
93ec662e 33#include <common/kernel-ctl/kernel-ctl.h>
b0880ae5
JG
34#include <common/dynamic-buffer.h>
35#include <common/buffer-view.h>
698fb2ed 36#include <common/trace-chunk.h>
823a1989 37#include <lttng/location-internal.h>
b0880ae5
JG
38#include <lttng/trigger/trigger-internal.h>
39#include <lttng/condition/condition.h>
40#include <lttng/action/action.h>
6e21424e 41#include <lttng/channel.h>
b0880ae5 42#include <lttng/channel-internal.h>
5c408ad8 43#include <lttng/rotate-internal.h>
17dd1232 44#include <lttng/location-internal.h>
5feee503 45#include <lttng/session-internal.h>
3c02e545 46#include <lttng/userspace-probe-internal.h>
5feee503 47#include <lttng/session-descriptor-internal.h>
9f449915 48#include <common/string-utils/string-utils.h>
2f77fc4b
DG
49
50#include "channel.h"
51#include "consumer.h"
52#include "event.h"
8782cc74 53#include "health-sessiond.h"
2f77fc4b
DG
54#include "kernel.h"
55#include "kernel-consumer.h"
56#include "lttng-sessiond.h"
57#include "utils.h"
0dbc2034 58#include "lttng-syscall.h"
7c1d2758 59#include "agent.h"
93ec662e 60#include "buffer-registry.h"
b0880ae5
JG
61#include "notification-thread.h"
62#include "notification-thread-commands.h"
5c408ad8
JD
63#include "rotate.h"
64#include "rotation-thread.h"
432b38d7 65#include "timer.h"
f28f9e44 66#include "agent-thread.h"
2f77fc4b
DG
67
68#include "cmd.h"
69
a503e1ef
JG
70/* Sleep for 100ms between each check for the shm path's deletion. */
71#define SESSION_DESTROY_SHM_PATH_CHECK_DELAY_US 100000
72
823a1989
JG
73struct cmd_destroy_session_reply_context {
74 int reply_sock_fd;
75 bool implicit_rotation_on_destroy;
57b5b1cf
JG
76 /*
77 * Indicates whether or not an error occurred while launching the
78 * destruction of a session.
79 */
80 enum lttng_error_code destruction_status;
823a1989
JG
81};
82
a503e1ef
JG
83static enum lttng_error_code wait_on_path(void *path);
84
85/*
86 * Command completion handler that is used by the destroy command
87 * when a session that has a non-default shm_path is being destroyed.
88 *
89 * See comment in cmd_destroy_session() for the rationale.
90 */
91static struct destroy_completion_handler {
92 struct cmd_completion_handler handler;
93 char shm_path[member_sizeof(struct ltt_session, shm_path)];
94} destroy_completion_handler = {
95 .handler = {
96 .run = wait_on_path,
97 .data = destroy_completion_handler.shm_path
98 },
99 .shm_path = { 0 },
100};
101
102static struct cmd_completion_handler *current_completion_handler;
103
2f77fc4b
DG
104/*
105 * Used to keep a unique index for each relayd socket created where this value
106 * is associated with streams on the consumer so it can match the right relayd
d88aee68
DG
107 * to send to. It must be accessed with the relayd_net_seq_idx_lock
108 * held.
2f77fc4b 109 */
d88aee68
DG
110static pthread_mutex_t relayd_net_seq_idx_lock = PTHREAD_MUTEX_INITIALIZER;
111static uint64_t relayd_net_seq_idx;
2f77fc4b 112
7076b56e
JG
113static int validate_ust_event_name(const char *);
114static int cmd_enable_event_internal(struct ltt_session *session,
6938db9c 115 const struct lttng_domain *domain,
7076b56e
JG
116 char *channel_name, struct lttng_event *event,
117 char *filter_expression,
118 struct lttng_filter_bytecode *filter,
119 struct lttng_event_exclusion *exclusion,
120 int wpipe);
121
2f77fc4b
DG
122/*
123 * Create a session path used by list_lttng_sessions for the case that the
124 * session consumer is on the network.
125 */
126static int build_network_session_path(char *dst, size_t size,
127 struct ltt_session *session)
128{
129 int ret, kdata_port, udata_port;
130 struct lttng_uri *kuri = NULL, *uuri = NULL, *uri = NULL;
131 char tmp_uurl[PATH_MAX], tmp_urls[PATH_MAX];
132
133 assert(session);
134 assert(dst);
135
136 memset(tmp_urls, 0, sizeof(tmp_urls));
137 memset(tmp_uurl, 0, sizeof(tmp_uurl));
138
139 kdata_port = udata_port = DEFAULT_NETWORK_DATA_PORT;
140
141 if (session->kernel_session && session->kernel_session->consumer) {
142 kuri = &session->kernel_session->consumer->dst.net.control;
143 kdata_port = session->kernel_session->consumer->dst.net.data.port;
144 }
145
146 if (session->ust_session && session->ust_session->consumer) {
147 uuri = &session->ust_session->consumer->dst.net.control;
148 udata_port = session->ust_session->consumer->dst.net.data.port;
149 }
150
151 if (uuri == NULL && kuri == NULL) {
152 uri = &session->consumer->dst.net.control;
153 kdata_port = session->consumer->dst.net.data.port;
154 } else if (kuri && uuri) {
155 ret = uri_compare(kuri, uuri);
156 if (ret) {
157 /* Not Equal */
158 uri = kuri;
159 /* Build uuri URL string */
160 ret = uri_to_str_url(uuri, tmp_uurl, sizeof(tmp_uurl));
161 if (ret < 0) {
162 goto error;
163 }
164 } else {
165 uri = kuri;
166 }
167 } else if (kuri && uuri == NULL) {
168 uri = kuri;
169 } else if (uuri && kuri == NULL) {
170 uri = uuri;
171 }
172
173 ret = uri_to_str_url(uri, tmp_urls, sizeof(tmp_urls));
174 if (ret < 0) {
175 goto error;
176 }
177
9aa9f900
DG
178 /*
179 * Do we have a UST url set. If yes, this means we have both kernel and UST
180 * to print.
181 */
9d035200 182 if (*tmp_uurl != '\0') {
2f77fc4b
DG
183 ret = snprintf(dst, size, "[K]: %s [data: %d] -- [U]: %s [data: %d]",
184 tmp_urls, kdata_port, tmp_uurl, udata_port);
185 } else {
9aa9f900 186 int dport;
bef08707 187 if (kuri || (!kuri && !uuri)) {
9aa9f900
DG
188 dport = kdata_port;
189 } else {
190 /* No kernel URI, use the UST port. */
191 dport = udata_port;
192 }
193 ret = snprintf(dst, size, "%s [data: %d]", tmp_urls, dport);
2f77fc4b
DG
194 }
195
196error:
197 return ret;
198}
199
fb83fe64
JD
200/*
201 * Get run-time attributes if the session has been started (discarded events,
202 * lost packets).
203 */
204static int get_kernel_runtime_stats(struct ltt_session *session,
205 struct ltt_kernel_channel *kchan, uint64_t *discarded_events,
206 uint64_t *lost_packets)
207{
208 int ret;
209
210 if (!session->has_been_started) {
211 ret = 0;
212 *discarded_events = 0;
213 *lost_packets = 0;
214 goto end;
215 }
216
e1f3997a 217 ret = consumer_get_discarded_events(session->id, kchan->key,
fb83fe64
JD
218 session->kernel_session->consumer,
219 discarded_events);
220 if (ret < 0) {
221 goto end;
222 }
223
e1f3997a 224 ret = consumer_get_lost_packets(session->id, kchan->key,
fb83fe64
JD
225 session->kernel_session->consumer,
226 lost_packets);
227 if (ret < 0) {
228 goto end;
229 }
230
231end:
232 return ret;
233}
234
235/*
236 * Get run-time attributes if the session has been started (discarded events,
237 * lost packets).
238 */
239static int get_ust_runtime_stats(struct ltt_session *session,
240 struct ltt_ust_channel *uchan, uint64_t *discarded_events,
241 uint64_t *lost_packets)
242{
243 int ret;
244 struct ltt_ust_session *usess;
245
a91c5803
JG
246 if (!discarded_events || !lost_packets) {
247 ret = -1;
248 goto end;
249 }
250
fb83fe64 251 usess = session->ust_session;
a905c624
JG
252 assert(discarded_events);
253 assert(lost_packets);
fb83fe64
JD
254
255 if (!usess || !session->has_been_started) {
256 *discarded_events = 0;
257 *lost_packets = 0;
258 ret = 0;
259 goto end;
260 }
261
262 if (usess->buffer_type == LTTNG_BUFFER_PER_UID) {
263 ret = ust_app_uid_get_channel_runtime_stats(usess->id,
264 &usess->buffer_reg_uid_list,
265 usess->consumer, uchan->id,
266 uchan->attr.overwrite,
267 discarded_events,
268 lost_packets);
269 } else if (usess->buffer_type == LTTNG_BUFFER_PER_PID) {
270 ret = ust_app_pid_get_channel_runtime_stats(usess,
271 uchan, usess->consumer,
272 uchan->attr.overwrite,
273 discarded_events,
274 lost_packets);
275 if (ret < 0) {
276 goto end;
277 }
278 *discarded_events += uchan->per_pid_closed_app_discarded;
279 *lost_packets += uchan->per_pid_closed_app_lost;
280 } else {
281 ERR("Unsupported buffer type");
967bc289 282 assert(0);
fb83fe64
JD
283 ret = -1;
284 goto end;
285 }
286
287end:
288 return ret;
289}
290
2f77fc4b
DG
291/*
292 * Fill lttng_channel array of all channels.
293 */
d449df4a 294static ssize_t list_lttng_channels(enum lttng_domain_type domain,
fb83fe64 295 struct ltt_session *session, struct lttng_channel *channels,
cf0bcb51 296 struct lttng_channel_extended *chan_exts)
2f77fc4b 297{
d449df4a 298 int i = 0, ret = 0;
2f77fc4b
DG
299 struct ltt_kernel_channel *kchan;
300
301 DBG("Listing channels for session %s", session->name);
302
303 switch (domain) {
304 case LTTNG_DOMAIN_KERNEL:
305 /* Kernel channels */
306 if (session->kernel_session != NULL) {
307 cds_list_for_each_entry(kchan,
308 &session->kernel_session->channel_list.head, list) {
fb83fe64 309 uint64_t discarded_events, lost_packets;
cf0bcb51
JG
310 struct lttng_channel_extended *extended;
311
312 extended = (struct lttng_channel_extended *)
313 kchan->channel->attr.extended.ptr;
fb83fe64
JD
314
315 ret = get_kernel_runtime_stats(session, kchan,
316 &discarded_events, &lost_packets);
317 if (ret < 0) {
318 goto end;
319 }
2f77fc4b
DG
320 /* Copy lttng_channel struct to array */
321 memcpy(&channels[i], kchan->channel, sizeof(struct lttng_channel));
322 channels[i].enabled = kchan->enabled;
fb83fe64
JD
323 chan_exts[i].discarded_events =
324 discarded_events;
325 chan_exts[i].lost_packets = lost_packets;
cf0bcb51
JG
326 chan_exts[i].monitor_timer_interval =
327 extended->monitor_timer_interval;
491d1539 328 chan_exts[i].blocking_timeout = 0;
2f77fc4b
DG
329 i++;
330 }
331 }
332 break;
333 case LTTNG_DOMAIN_UST:
334 {
335 struct lttng_ht_iter iter;
336 struct ltt_ust_channel *uchan;
337
e7fe706f 338 rcu_read_lock();
2f77fc4b
DG
339 cds_lfht_for_each_entry(session->ust_session->domain_global.channels->ht,
340 &iter.iter, uchan, node.node) {
a91c5803 341 uint64_t discarded_events = 0, lost_packets = 0;
fb83fe64 342
8ee609c8
MD
343 if (lttng_strncpy(channels[i].name, uchan->name,
344 LTTNG_SYMBOL_NAME_LEN)) {
345 break;
346 }
2f77fc4b
DG
347 channels[i].attr.overwrite = uchan->attr.overwrite;
348 channels[i].attr.subbuf_size = uchan->attr.subbuf_size;
349 channels[i].attr.num_subbuf = uchan->attr.num_subbuf;
350 channels[i].attr.switch_timer_interval =
351 uchan->attr.switch_timer_interval;
352 channels[i].attr.read_timer_interval =
353 uchan->attr.read_timer_interval;
354 channels[i].enabled = uchan->enabled;
2f785fe7
DG
355 channels[i].attr.tracefile_size = uchan->tracefile_size;
356 channels[i].attr.tracefile_count = uchan->tracefile_count;
5e4435a4
JG
357
358 /*
359 * Map enum lttng_ust_output to enum lttng_event_output.
360 */
2f77fc4b
DG
361 switch (uchan->attr.output) {
362 case LTTNG_UST_MMAP:
2f77fc4b
DG
363 channels[i].attr.output = LTTNG_EVENT_MMAP;
364 break;
5e4435a4
JG
365 default:
366 /*
367 * LTTNG_UST_MMAP is the only supported UST
368 * output mode.
369 */
370 assert(0);
371 break;
2f77fc4b 372 }
fb83fe64 373
d449df4a
MD
374 chan_exts[i].monitor_timer_interval =
375 uchan->monitor_timer_interval;
491d1539
MD
376 chan_exts[i].blocking_timeout =
377 uchan->attr.u.s.blocking_timeout;
d449df4a 378
fb83fe64
JD
379 ret = get_ust_runtime_stats(session, uchan,
380 &discarded_events, &lost_packets);
381 if (ret < 0) {
382 break;
383 }
384 chan_exts[i].discarded_events = discarded_events;
385 chan_exts[i].lost_packets = lost_packets;
2f77fc4b
DG
386 i++;
387 }
e7fe706f 388 rcu_read_unlock();
2f77fc4b
DG
389 break;
390 }
391 default:
392 break;
393 }
fb83fe64
JD
394
395end:
d449df4a
MD
396 if (ret < 0) {
397 return -LTTNG_ERR_FATAL;
398 } else {
399 return LTTNG_OK;
400 }
2f77fc4b
DG
401}
402
3c02e545
FD
403static int increment_extended_len(const char *filter_expression,
404 struct lttng_event_exclusion *exclusion,
405 const struct lttng_userspace_probe_location *probe_location,
406 size_t *extended_len)
b4e3ceb9 407{
3c02e545
FD
408 int ret = 0;
409
b4e3ceb9
PP
410 *extended_len += sizeof(struct lttcomm_event_extended_header);
411
412 if (filter_expression) {
413 *extended_len += strlen(filter_expression) + 1;
414 }
795d57ce
PP
415
416 if (exclusion) {
417 *extended_len += exclusion->count * LTTNG_SYMBOL_NAME_LEN;
418 }
3c02e545
FD
419
420 if (probe_location) {
421 ret = lttng_userspace_probe_location_serialize(probe_location,
422 NULL, NULL);
423 if (ret < 0) {
424 goto end;
425 }
426 *extended_len += ret;
427 }
428 ret = 0;
429end:
430 return ret;
b4e3ceb9
PP
431}
432
3c02e545
FD
433static int append_extended_info(const char *filter_expression,
434 struct lttng_event_exclusion *exclusion,
435 struct lttng_userspace_probe_location *probe_location,
436 void **extended_at)
b4e3ceb9 437{
3c02e545 438 int ret = 0;
b4e3ceb9 439 size_t filter_len = 0;
795d57ce 440 size_t nb_exclusions = 0;
3c02e545
FD
441 size_t userspace_probe_location_len = 0;
442 struct lttng_dynamic_buffer location_buffer;
443 struct lttcomm_event_extended_header extended_header;
b4e3ceb9
PP
444
445 if (filter_expression) {
446 filter_len = strlen(filter_expression) + 1;
447 }
448
795d57ce
PP
449 if (exclusion) {
450 nb_exclusions = exclusion->count;
451 }
452
3c02e545
FD
453 if (probe_location) {
454 lttng_dynamic_buffer_init(&location_buffer);
455 ret = lttng_userspace_probe_location_serialize(probe_location,
456 &location_buffer, NULL);
457 if (ret < 0) {
458 ret = -1;
459 goto end;
460 }
461 userspace_probe_location_len = location_buffer.size;
462 }
463
795d57ce 464 /* Set header fields */
b4e3ceb9 465 extended_header.filter_len = filter_len;
795d57ce 466 extended_header.nb_exclusions = nb_exclusions;
3c02e545 467 extended_header.userspace_probe_location_len = userspace_probe_location_len;
795d57ce
PP
468
469 /* Copy header */
b4e3ceb9
PP
470 memcpy(*extended_at, &extended_header, sizeof(extended_header));
471 *extended_at += sizeof(extended_header);
795d57ce
PP
472
473 /* Copy filter string */
474 if (filter_expression) {
475 memcpy(*extended_at, filter_expression, filter_len);
476 *extended_at += filter_len;
477 }
478
479 /* Copy exclusion names */
480 if (exclusion) {
481 size_t len = nb_exclusions * LTTNG_SYMBOL_NAME_LEN;
482
483 memcpy(*extended_at, &exclusion->names, len);
484 *extended_at += len;
485 }
3c02e545
FD
486
487 if (probe_location) {
488 memcpy(*extended_at, location_buffer.data, location_buffer.size);
489 *extended_at += location_buffer.size;
490 lttng_dynamic_buffer_reset(&location_buffer);
491 }
492 ret = 0;
493end:
494 return ret;
b4e3ceb9
PP
495}
496
3c6a091f 497/*
022d91ba 498 * Create a list of agent domain events.
3c6a091f
DG
499 *
500 * Return number of events in list on success or else a negative value.
501 */
022d91ba 502static int list_lttng_agent_events(struct agent *agt,
b4e3ceb9 503 struct lttng_event **events, size_t *total_size)
3c6a091f
DG
504{
505 int i = 0, ret = 0;
506 unsigned int nb_event = 0;
022d91ba 507 struct agent_event *event;
47e52862 508 struct lttng_event *tmp_events = NULL;
3c6a091f 509 struct lttng_ht_iter iter;
b4e3ceb9
PP
510 size_t extended_len = 0;
511 void *extended_at;
3c6a091f 512
022d91ba 513 assert(agt);
3c6a091f
DG
514 assert(events);
515
022d91ba 516 DBG3("Listing agent events");
3c6a091f 517
e5bbf678 518 rcu_read_lock();
022d91ba 519 nb_event = lttng_ht_get_count(agt->events);
e5bbf678 520 rcu_read_unlock();
3c6a091f
DG
521 if (nb_event == 0) {
522 ret = nb_event;
b4e3ceb9 523 *total_size = 0;
3c6a091f
DG
524 goto error;
525 }
526
b4e3ceb9
PP
527 /* Compute required extended infos size */
528 extended_len = nb_event * sizeof(struct lttcomm_event_extended_header);
529
530 /*
531 * This is only valid because the commands which add events are
532 * processed in the same thread as the listing.
533 */
534 rcu_read_lock();
535 cds_lfht_for_each_entry(agt->events->ht, &iter.iter, event, node.node) {
3c02e545 536 ret = increment_extended_len(event->filter_expression, NULL, NULL,
795d57ce 537 &extended_len);
3c02e545
FD
538 if (ret) {
539 DBG("Error computing the length of extended info message");
540 ret = -LTTNG_ERR_FATAL;
541 goto error;
542 }
b4e3ceb9
PP
543 }
544 rcu_read_unlock();
545
546 *total_size = nb_event * sizeof(*tmp_events) + extended_len;
547 tmp_events = zmalloc(*total_size);
3c6a091f 548 if (!tmp_events) {
022d91ba 549 PERROR("zmalloc agent events session");
3c6a091f
DG
550 ret = -LTTNG_ERR_FATAL;
551 goto error;
552 }
553
b4e3ceb9
PP
554 extended_at = ((uint8_t *) tmp_events) +
555 nb_event * sizeof(struct lttng_event);
556
3c6a091f 557 rcu_read_lock();
022d91ba 558 cds_lfht_for_each_entry(agt->events->ht, &iter.iter, event, node.node) {
3c6a091f
DG
559 strncpy(tmp_events[i].name, event->name, sizeof(tmp_events[i].name));
560 tmp_events[i].name[sizeof(tmp_events[i].name) - 1] = '\0';
561 tmp_events[i].enabled = event->enabled;
2106efa0 562 tmp_events[i].loglevel = event->loglevel_value;
ff94328f 563 tmp_events[i].loglevel_type = event->loglevel_type;
3c6a091f 564 i++;
b4e3ceb9
PP
565
566 /* Append extended info */
3c02e545 567 ret = append_extended_info(event->filter_expression, NULL, NULL,
795d57ce 568 &extended_at);
3c02e545
FD
569 if (ret) {
570 DBG("Error appending extended info message");
571 ret = -LTTNG_ERR_FATAL;
572 goto error;
573 }
3c6a091f 574 }
3c6a091f
DG
575
576 *events = tmp_events;
577 ret = nb_event;
3c02e545 578 assert(nb_event == i);
3c6a091f 579
47e52862 580end:
3c02e545 581 rcu_read_unlock();
3c6a091f 582 return ret;
47e52862
JG
583error:
584 free(tmp_events);
585 goto end;
3c6a091f
DG
586}
587
2f77fc4b
DG
588/*
589 * Create a list of ust global domain events.
590 */
591static int list_lttng_ust_global_events(char *channel_name,
b4e3ceb9
PP
592 struct ltt_ust_domain_global *ust_global,
593 struct lttng_event **events, size_t *total_size)
2f77fc4b
DG
594{
595 int i = 0, ret = 0;
596 unsigned int nb_event = 0;
597 struct lttng_ht_iter iter;
598 struct lttng_ht_node_str *node;
599 struct ltt_ust_channel *uchan;
600 struct ltt_ust_event *uevent;
601 struct lttng_event *tmp;
b4e3ceb9
PP
602 size_t extended_len = 0;
603 void *extended_at;
2f77fc4b
DG
604
605 DBG("Listing UST global events for channel %s", channel_name);
606
607 rcu_read_lock();
608
609 lttng_ht_lookup(ust_global->channels, (void *)channel_name, &iter);
610 node = lttng_ht_iter_get_node_str(&iter);
611 if (node == NULL) {
f73fabfd 612 ret = LTTNG_ERR_UST_CHAN_NOT_FOUND;
d31d3e8c 613 goto end;
2f77fc4b
DG
614 }
615
616 uchan = caa_container_of(&node->node, struct ltt_ust_channel, node.node);
617
3c442be3 618 nb_event = lttng_ht_get_count(uchan->events);
2f77fc4b
DG
619 if (nb_event == 0) {
620 ret = nb_event;
b4e3ceb9 621 *total_size = 0;
d31d3e8c 622 goto end;
2f77fc4b
DG
623 }
624
625 DBG3("Listing UST global %d events", nb_event);
626
b4e3ceb9
PP
627 /* Compute required extended infos size */
628 cds_lfht_for_each_entry(uchan->events->ht, &iter.iter, uevent, node.node) {
629 if (uevent->internal) {
630 nb_event--;
631 continue;
632 }
633
3c02e545
FD
634 ret = increment_extended_len(uevent->filter_expression,
635 uevent->exclusion, NULL, &extended_len);
636 if (ret) {
637 DBG("Error computing the length of extended info message");
638 ret = -LTTNG_ERR_FATAL;
639 goto end;
640 }
b4e3ceb9 641 }
d31d3e8c
PP
642 if (nb_event == 0) {
643 /* All events are internal, skip. */
644 ret = 0;
645 *total_size = 0;
646 goto end;
647 }
b4e3ceb9
PP
648
649 *total_size = nb_event * sizeof(struct lttng_event) + extended_len;
650 tmp = zmalloc(*total_size);
2f77fc4b 651 if (tmp == NULL) {
b12c38df
JG
652 ret = -LTTNG_ERR_FATAL;
653 goto end;
2f77fc4b
DG
654 }
655
b4e3ceb9
PP
656 extended_at = ((uint8_t *) tmp) + nb_event * sizeof(struct lttng_event);
657
2f77fc4b 658 cds_lfht_for_each_entry(uchan->events->ht, &iter.iter, uevent, node.node) {
3c442be3
JG
659 if (uevent->internal) {
660 /* This event should remain hidden from clients */
3c442be3
JG
661 continue;
662 }
2f77fc4b
DG
663 strncpy(tmp[i].name, uevent->attr.name, LTTNG_SYMBOL_NAME_LEN);
664 tmp[i].name[LTTNG_SYMBOL_NAME_LEN - 1] = '\0';
665 tmp[i].enabled = uevent->enabled;
666
667 switch (uevent->attr.instrumentation) {
668 case LTTNG_UST_TRACEPOINT:
669 tmp[i].type = LTTNG_EVENT_TRACEPOINT;
670 break;
671 case LTTNG_UST_PROBE:
672 tmp[i].type = LTTNG_EVENT_PROBE;
673 break;
674 case LTTNG_UST_FUNCTION:
675 tmp[i].type = LTTNG_EVENT_FUNCTION;
676 break;
677 }
678
679 tmp[i].loglevel = uevent->attr.loglevel;
680 switch (uevent->attr.loglevel_type) {
681 case LTTNG_UST_LOGLEVEL_ALL:
682 tmp[i].loglevel_type = LTTNG_EVENT_LOGLEVEL_ALL;
683 break;
684 case LTTNG_UST_LOGLEVEL_RANGE:
685 tmp[i].loglevel_type = LTTNG_EVENT_LOGLEVEL_RANGE;
686 break;
687 case LTTNG_UST_LOGLEVEL_SINGLE:
688 tmp[i].loglevel_type = LTTNG_EVENT_LOGLEVEL_SINGLE;
689 break;
690 }
691 if (uevent->filter) {
692 tmp[i].filter = 1;
693 }
4634f12e
JI
694 if (uevent->exclusion) {
695 tmp[i].exclusion = 1;
696 }
2f77fc4b 697 i++;
b4e3ceb9
PP
698
699 /* Append extended info */
3c02e545
FD
700 ret = append_extended_info(uevent->filter_expression,
701 uevent->exclusion, NULL, &extended_at);
702 if (ret) {
703 DBG("Error appending extended info message");
704 ret = -LTTNG_ERR_FATAL;
705 goto end;
706 }
2f77fc4b
DG
707 }
708
709 ret = nb_event;
710 *events = tmp;
d31d3e8c 711end:
2f77fc4b
DG
712 rcu_read_unlock();
713 return ret;
714}
715
716/*
717 * Fill lttng_event array of all kernel events in the channel.
718 */
719static int list_lttng_kernel_events(char *channel_name,
b4e3ceb9
PP
720 struct ltt_kernel_session *kernel_session,
721 struct lttng_event **events, size_t *total_size)
2f77fc4b
DG
722{
723 int i = 0, ret;
724 unsigned int nb_event;
725 struct ltt_kernel_event *event;
726 struct ltt_kernel_channel *kchan;
b4e3ceb9
PP
727 size_t extended_len = 0;
728 void *extended_at;
2f77fc4b
DG
729
730 kchan = trace_kernel_get_channel_by_name(channel_name, kernel_session);
731 if (kchan == NULL) {
f73fabfd 732 ret = LTTNG_ERR_KERN_CHAN_NOT_FOUND;
2f77fc4b
DG
733 goto error;
734 }
735
736 nb_event = kchan->event_count;
737
738 DBG("Listing events for channel %s", kchan->channel->name);
739
740 if (nb_event == 0) {
b4e3ceb9 741 *total_size = 0;
834978fd 742 *events = NULL;
db906c12 743 goto end;
2f77fc4b
DG
744 }
745
b4e3ceb9
PP
746 /* Compute required extended infos size */
747 cds_list_for_each_entry(event, &kchan->events_list.head, list) {
3c02e545
FD
748 ret = increment_extended_len(event->filter_expression, NULL,
749 event->userspace_probe_location,
795d57ce 750 &extended_len);
3c02e545
FD
751 if (ret) {
752 DBG("Error computing the length of extended info message");
753 ret = -LTTNG_ERR_FATAL;
754 goto error;
755 }
b4e3ceb9
PP
756 }
757
758 *total_size = nb_event * sizeof(struct lttng_event) + extended_len;
759 *events = zmalloc(*total_size);
2f77fc4b 760 if (*events == NULL) {
3c02e545 761 ret = -LTTNG_ERR_FATAL;
2f77fc4b
DG
762 goto error;
763 }
764
ab4aa612 765 extended_at = ((void *) *events) +
b4e3ceb9
PP
766 nb_event * sizeof(struct lttng_event);
767
2f77fc4b
DG
768 /* Kernel channels */
769 cds_list_for_each_entry(event, &kchan->events_list.head , list) {
770 strncpy((*events)[i].name, event->event->name, LTTNG_SYMBOL_NAME_LEN);
771 (*events)[i].name[LTTNG_SYMBOL_NAME_LEN - 1] = '\0';
772 (*events)[i].enabled = event->enabled;
00f992f2
JG
773 (*events)[i].filter =
774 (unsigned char) !!event->filter_expression;
2f77fc4b
DG
775
776 switch (event->event->instrumentation) {
777 case LTTNG_KERNEL_TRACEPOINT:
778 (*events)[i].type = LTTNG_EVENT_TRACEPOINT;
779 break;
2f77fc4b 780 case LTTNG_KERNEL_KRETPROBE:
1896972b
DG
781 (*events)[i].type = LTTNG_EVENT_FUNCTION;
782 memcpy(&(*events)[i].attr.probe, &event->event->u.kprobe,
783 sizeof(struct lttng_kernel_kprobe));
784 break;
785 case LTTNG_KERNEL_KPROBE:
2f77fc4b
DG
786 (*events)[i].type = LTTNG_EVENT_PROBE;
787 memcpy(&(*events)[i].attr.probe, &event->event->u.kprobe,
788 sizeof(struct lttng_kernel_kprobe));
789 break;
b955b4d4
FD
790 case LTTNG_KERNEL_UPROBE:
791 (*events)[i].type = LTTNG_EVENT_USERSPACE_PROBE;
792 break;
2f77fc4b
DG
793 case LTTNG_KERNEL_FUNCTION:
794 (*events)[i].type = LTTNG_EVENT_FUNCTION;
795 memcpy(&((*events)[i].attr.ftrace), &event->event->u.ftrace,
796 sizeof(struct lttng_kernel_function));
797 break;
798 case LTTNG_KERNEL_NOOP:
799 (*events)[i].type = LTTNG_EVENT_NOOP;
800 break;
801 case LTTNG_KERNEL_SYSCALL:
802 (*events)[i].type = LTTNG_EVENT_SYSCALL;
803 break;
804 case LTTNG_KERNEL_ALL:
1ab8c2ad
FD
805 /* fall-through. */
806 default:
2f77fc4b
DG
807 assert(0);
808 break;
809 }
810 i++;
b4e3ceb9
PP
811
812 /* Append extended info */
3c02e545
FD
813 ret = append_extended_info(event->filter_expression, NULL,
814 event->userspace_probe_location, &extended_at);
815 if (ret) {
816 DBG("Error appending extended info message");
817 ret = -LTTNG_ERR_FATAL;
818 goto error;
819 }
2f77fc4b
DG
820 }
821
db906c12 822end:
2f77fc4b
DG
823 return nb_event;
824
825error:
72d6ec2f 826 return ret;
2f77fc4b
DG
827}
828
829/*
830 * Add URI so the consumer output object. Set the correct path depending on the
831 * domain adding the default trace directory.
832 */
5feee503
JG
833static enum lttng_error_code add_uri_to_consumer(
834 const struct ltt_session *session,
835 struct consumer_output *consumer,
836 struct lttng_uri *uri, enum lttng_domain_type domain)
2f77fc4b 837{
5feee503
JG
838 int ret;
839 enum lttng_error_code ret_code = LTTNG_OK;
2f77fc4b
DG
840
841 assert(uri);
842
843 if (consumer == NULL) {
844 DBG("No consumer detected. Don't add URI. Stopping.");
5feee503 845 ret_code = LTTNG_ERR_NO_CONSUMER;
2f77fc4b
DG
846 goto error;
847 }
848
849 switch (domain) {
850 case LTTNG_DOMAIN_KERNEL:
5feee503
JG
851 ret = lttng_strncpy(consumer->domain_subdir,
852 DEFAULT_KERNEL_TRACE_DIR,
853 sizeof(consumer->domain_subdir));
2f77fc4b
DG
854 break;
855 case LTTNG_DOMAIN_UST:
5feee503
JG
856 ret = lttng_strncpy(consumer->domain_subdir,
857 DEFAULT_UST_TRACE_DIR,
858 sizeof(consumer->domain_subdir));
2f77fc4b
DG
859 break;
860 default:
861 /*
5feee503
JG
862 * This case is possible is we try to add the URI to the global
863 * tracing session consumer object which in this case there is
864 * no subdir.
2f77fc4b 865 */
5feee503
JG
866 memset(consumer->domain_subdir, 0,
867 sizeof(consumer->domain_subdir));
868 ret = 0;
869 }
870 if (ret) {
871 ERR("Failed to initialize consumer output domain subdirectory");
872 ret_code = LTTNG_ERR_FATAL;
873 goto error;
2f77fc4b
DG
874 }
875
876 switch (uri->dtype) {
877 case LTTNG_DST_IPV4:
878 case LTTNG_DST_IPV6:
879 DBG2("Setting network URI to consumer");
880
df75acac
DG
881 if (consumer->type == CONSUMER_DST_NET) {
882 if ((uri->stype == LTTNG_STREAM_CONTROL &&
785d2d0d
DG
883 consumer->dst.net.control_isset) ||
884 (uri->stype == LTTNG_STREAM_DATA &&
885 consumer->dst.net.data_isset)) {
5feee503 886 ret_code = LTTNG_ERR_URL_EXIST;
df75acac
DG
887 goto error;
888 }
889 } else {
5feee503 890 memset(&consumer->dst, 0, sizeof(consumer->dst));
785d2d0d
DG
891 }
892
2f77fc4b 893 /* Set URI into consumer output object */
5feee503 894 ret = consumer_set_network_uri(session, consumer, uri);
2f77fc4b 895 if (ret < 0) {
5feee503 896 ret_code = -ret;
2f77fc4b
DG
897 goto error;
898 } else if (ret == 1) {
899 /*
900 * URI was the same in the consumer so we do not append the subdir
901 * again so to not duplicate output dir.
902 */
5feee503 903 ret_code = LTTNG_OK;
2f77fc4b
DG
904 goto error;
905 }
2f77fc4b
DG
906 break;
907 case LTTNG_DST_PATH:
5feee503
JG
908 if (*uri->dst.path != '/' || strstr(uri->dst.path, "../")) {
909 ret_code = LTTNG_ERR_INVALID;
9ac05d92
MD
910 goto error;
911 }
5feee503
JG
912 DBG2("Setting trace directory path from URI to %s",
913 uri->dst.path);
914 memset(&consumer->dst, 0, sizeof(consumer->dst));
915
916 ret = lttng_strncpy(consumer->dst.session_root_path,
917 uri->dst.path,
918 sizeof(consumer->dst.session_root_path));
faff536a
JG
919 if (ret) {
920 ret_code = LTTNG_ERR_FATAL;
921 goto error;
922 }
2f77fc4b
DG
923 consumer->type = CONSUMER_DST_LOCAL;
924 break;
925 }
926
5feee503 927 ret_code = LTTNG_OK;
2f77fc4b 928error:
5feee503 929 return ret_code;
2f77fc4b
DG
930}
931
932/*
933 * Init tracing by creating trace directory and sending fds kernel consumer.
934 */
935static int init_kernel_tracing(struct ltt_kernel_session *session)
936{
937 int ret = 0;
938 struct lttng_ht_iter iter;
939 struct consumer_socket *socket;
940
941 assert(session);
942
e7fe706f
DG
943 rcu_read_lock();
944
2f77fc4b
DG
945 if (session->consumer_fds_sent == 0 && session->consumer != NULL) {
946 cds_lfht_for_each_entry(session->consumer->socks->ht, &iter.iter,
947 socket, node.node) {
2f77fc4b 948 pthread_mutex_lock(socket->lock);
f50f23d9 949 ret = kernel_consumer_send_session(socket, session);
2f77fc4b
DG
950 pthread_mutex_unlock(socket->lock);
951 if (ret < 0) {
f73fabfd 952 ret = LTTNG_ERR_KERN_CONSUMER_FAIL;
2f77fc4b
DG
953 goto error;
954 }
955 }
956 }
957
958error:
e7fe706f 959 rcu_read_unlock();
2f77fc4b
DG
960 return ret;
961}
962
963/*
964 * Create a socket to the relayd using the URI.
965 *
966 * On success, the relayd_sock pointer is set to the created socket.
8f07cd01 967 * Else, it remains untouched and an LTTng error code is returned.
2f77fc4b 968 */
8f07cd01 969static enum lttng_error_code create_connect_relayd(struct lttng_uri *uri,
b31610f2
JD
970 struct lttcomm_relayd_sock **relayd_sock,
971 struct consumer_output *consumer)
2f77fc4b
DG
972{
973 int ret;
8f07cd01 974 enum lttng_error_code status = LTTNG_OK;
6151a90f 975 struct lttcomm_relayd_sock *rsock;
2f77fc4b 976
6151a90f
JD
977 rsock = lttcomm_alloc_relayd_sock(uri, RELAYD_VERSION_COMM_MAJOR,
978 RELAYD_VERSION_COMM_MINOR);
979 if (!rsock) {
8f07cd01 980 status = LTTNG_ERR_FATAL;
2f77fc4b
DG
981 goto error;
982 }
983
ffe60014
DG
984 /*
985 * Connect to relayd so we can proceed with a session creation. This call
986 * can possibly block for an arbitrary amount of time to set the health
987 * state to be in poll execution.
988 */
989 health_poll_entry();
6151a90f 990 ret = relayd_connect(rsock);
ffe60014 991 health_poll_exit();
2f77fc4b
DG
992 if (ret < 0) {
993 ERR("Unable to reach lttng-relayd");
8f07cd01 994 status = LTTNG_ERR_RELAYD_CONNECT_FAIL;
2f77fc4b
DG
995 goto free_sock;
996 }
997
998 /* Create socket for control stream. */
999 if (uri->stype == LTTNG_STREAM_CONTROL) {
1000 DBG3("Creating relayd stream socket from URI");
1001
1002 /* Check relayd version */
6151a90f 1003 ret = relayd_version_check(rsock);
67d5aa28 1004 if (ret == LTTNG_ERR_RELAYD_VERSION_FAIL) {
8f07cd01 1005 status = LTTNG_ERR_RELAYD_VERSION_FAIL;
67d5aa28
JD
1006 goto close_sock;
1007 } else if (ret < 0) {
1008 ERR("Unable to reach lttng-relayd");
8f07cd01 1009 status = LTTNG_ERR_RELAYD_CONNECT_FAIL;
2f77fc4b
DG
1010 goto close_sock;
1011 }
b31610f2
JD
1012 consumer->relay_major_version = rsock->major;
1013 consumer->relay_minor_version = rsock->minor;
2f77fc4b
DG
1014 } else if (uri->stype == LTTNG_STREAM_DATA) {
1015 DBG3("Creating relayd data socket from URI");
1016 } else {
1017 /* Command is not valid */
1018 ERR("Relayd invalid stream type: %d", uri->stype);
8f07cd01 1019 status = LTTNG_ERR_INVALID;
2f77fc4b
DG
1020 goto close_sock;
1021 }
1022
6151a90f 1023 *relayd_sock = rsock;
2f77fc4b 1024
8f07cd01 1025 return status;
2f77fc4b
DG
1026
1027close_sock:
6151a90f
JD
1028 /* The returned value is not useful since we are on an error path. */
1029 (void) relayd_close(rsock);
2f77fc4b 1030free_sock:
6151a90f 1031 free(rsock);
2f77fc4b 1032error:
8f07cd01 1033 return status;
2f77fc4b
DG
1034}
1035
1036/*
1037 * Connect to the relayd using URI and send the socket to the right consumer.
43fade62
JG
1038 *
1039 * The consumer socket lock must be held by the caller.
8f07cd01
JG
1040 *
1041 * Returns LTTNG_OK on success or an LTTng error code on failure.
2f77fc4b 1042 */
8f07cd01
JG
1043static enum lttng_error_code send_consumer_relayd_socket(
1044 unsigned int session_id,
3044f922 1045 struct lttng_uri *relayd_uri,
56a37563 1046 struct consumer_output *consumer,
d3e2ba59 1047 struct consumer_socket *consumer_sock,
65ff8ea3 1048 const char *session_name, const char *hostname,
6ef36453 1049 const char *base_path, int session_live_timer,
0fb564b1 1050 const uint64_t *current_chunk_id,
55ce50b6
MD
1051 time_t session_creation_time,
1052 bool session_name_contains_creation_time)
2f77fc4b
DG
1053{
1054 int ret;
6151a90f 1055 struct lttcomm_relayd_sock *rsock = NULL;
8f07cd01 1056 enum lttng_error_code status;
2f77fc4b 1057
ffe60014 1058 /* Connect to relayd and make version check if uri is the control. */
8f07cd01
JG
1059 status = create_connect_relayd(relayd_uri, &rsock, consumer);
1060 if (status != LTTNG_OK) {
9e218353 1061 goto relayd_comm_error;
ffe60014 1062 }
6151a90f 1063 assert(rsock);
ffe60014 1064
2f77fc4b 1065 /* Set the network sequence index if not set. */
d88aee68
DG
1066 if (consumer->net_seq_index == (uint64_t) -1ULL) {
1067 pthread_mutex_lock(&relayd_net_seq_idx_lock);
2f77fc4b
DG
1068 /*
1069 * Increment net_seq_idx because we are about to transfer the
1070 * new relayd socket to the consumer.
d88aee68 1071 * Assign unique key so the consumer can match streams.
2f77fc4b 1072 */
d88aee68
DG
1073 consumer->net_seq_index = ++relayd_net_seq_idx;
1074 pthread_mutex_unlock(&relayd_net_seq_idx_lock);
2f77fc4b
DG
1075 }
1076
2f77fc4b 1077 /* Send relayd socket to consumer. */
6151a90f 1078 ret = consumer_send_relayd_socket(consumer_sock, rsock, consumer,
d3e2ba59 1079 relayd_uri->stype, session_id,
6ef36453
MD
1080 session_name, hostname, base_path,
1081 session_live_timer, current_chunk_id,
55ce50b6 1082 session_creation_time, session_name_contains_creation_time);
2f77fc4b 1083 if (ret < 0) {
8f07cd01 1084 status = LTTNG_ERR_ENABLE_CONSUMER_FAIL;
2f77fc4b
DG
1085 goto close_sock;
1086 }
1087
c890b720
DG
1088 /* Flag that the corresponding socket was sent. */
1089 if (relayd_uri->stype == LTTNG_STREAM_CONTROL) {
ffe60014 1090 consumer_sock->control_sock_sent = 1;
c890b720 1091 } else if (relayd_uri->stype == LTTNG_STREAM_DATA) {
ffe60014 1092 consumer_sock->data_sock_sent = 1;
c890b720
DG
1093 }
1094
2f77fc4b
DG
1095 /*
1096 * Close socket which was dup on the consumer side. The session daemon does
1097 * NOT keep track of the relayd socket(s) once transfer to the consumer.
1098 */
1099
1100close_sock:
8f07cd01 1101 if (status != LTTNG_OK) {
ffe60014 1102 /*
d9078d0c
DG
1103 * The consumer output for this session should not be used anymore
1104 * since the relayd connection failed thus making any tracing or/and
1105 * streaming not usable.
ffe60014 1106 */
d9078d0c 1107 consumer->enabled = 0;
ffe60014 1108 }
9e218353
JR
1109 (void) relayd_close(rsock);
1110 free(rsock);
1111
1112relayd_comm_error:
8f07cd01 1113 return status;
2f77fc4b
DG
1114}
1115
1116/*
1117 * Send both relayd sockets to a specific consumer and domain. This is a
1118 * helper function to facilitate sending the information to the consumer for a
1119 * session.
43fade62
JG
1120 *
1121 * The consumer socket lock must be held by the caller.
8f07cd01
JG
1122 *
1123 * Returns LTTNG_OK, or an LTTng error code on failure.
2f77fc4b 1124 */
8f07cd01
JG
1125static enum lttng_error_code send_consumer_relayd_sockets(
1126 enum lttng_domain_type domain,
56a37563 1127 unsigned int session_id, struct consumer_output *consumer,
65ff8ea3 1128 struct consumer_socket *sock, const char *session_name,
6ef36453 1129 const char *hostname, const char *base_path, int session_live_timer,
55ce50b6
MD
1130 const uint64_t *current_chunk_id, time_t session_creation_time,
1131 bool session_name_contains_creation_time)
2f77fc4b 1132{
8f07cd01 1133 enum lttng_error_code status = LTTNG_OK;
2f77fc4b 1134
2f77fc4b 1135 assert(consumer);
6dc3064a 1136 assert(sock);
2f77fc4b 1137
2f77fc4b 1138 /* Sending control relayd socket. */
ffe60014 1139 if (!sock->control_sock_sent) {
8f07cd01 1140 status = send_consumer_relayd_socket(session_id,
d3e2ba59 1141 &consumer->dst.net.control, consumer, sock,
6ef36453 1142 session_name, hostname, base_path, session_live_timer,
55ce50b6
MD
1143 current_chunk_id, session_creation_time,
1144 session_name_contains_creation_time);
8f07cd01 1145 if (status != LTTNG_OK) {
c890b720
DG
1146 goto error;
1147 }
2f77fc4b
DG
1148 }
1149
1150 /* Sending data relayd socket. */
ffe60014 1151 if (!sock->data_sock_sent) {
8f07cd01 1152 status = send_consumer_relayd_socket(session_id,
d3e2ba59 1153 &consumer->dst.net.data, consumer, sock,
6ef36453 1154 session_name, hostname, base_path, session_live_timer,
55ce50b6
MD
1155 current_chunk_id, session_creation_time,
1156 session_name_contains_creation_time);
8f07cd01 1157 if (status != LTTNG_OK) {
c890b720
DG
1158 goto error;
1159 }
2f77fc4b
DG
1160 }
1161
2f77fc4b 1162error:
8f07cd01 1163 return status;
2f77fc4b
DG
1164}
1165
1166/*
1167 * Setup relayd connections for a tracing session. First creates the socket to
1168 * the relayd and send them to the right domain consumer. Consumer type MUST be
1169 * network.
1170 */
ffe60014 1171int cmd_setup_relayd(struct ltt_session *session)
2f77fc4b 1172{
f73fabfd 1173 int ret = LTTNG_OK;
2f77fc4b
DG
1174 struct ltt_ust_session *usess;
1175 struct ltt_kernel_session *ksess;
1176 struct consumer_socket *socket;
1177 struct lttng_ht_iter iter;
b2c25d00 1178 LTTNG_OPTIONAL(uint64_t) current_chunk_id = {};
2f77fc4b 1179
b2c25d00 1180 assert(session);
2f77fc4b
DG
1181
1182 usess = session->ust_session;
1183 ksess = session->kernel_session;
1184
785d2d0d 1185 DBG("Setting relayd for session %s", session->name);
2f77fc4b 1186
95b2346e 1187 rcu_read_lock();
b2c25d00
JG
1188 if (session->current_trace_chunk) {
1189 enum lttng_trace_chunk_status status = lttng_trace_chunk_get_id(
1190 session->current_trace_chunk, &current_chunk_id.value);
1191
1192 if (status == LTTNG_TRACE_CHUNK_STATUS_OK) {
1193 current_chunk_id.is_set = true;
1194 } else {
1195 ERR("Failed to get current trace chunk id");
1196 ret = LTTNG_ERR_UNK;
1197 goto error;
1198 }
1199 }
1200
2f77fc4b
DG
1201 if (usess && usess->consumer && usess->consumer->type == CONSUMER_DST_NET
1202 && usess->consumer->enabled) {
1203 /* For each consumer socket, send relayd sockets */
1204 cds_lfht_for_each_entry(usess->consumer->socks->ht, &iter.iter,
1205 socket, node.node) {
2f77fc4b 1206 pthread_mutex_lock(socket->lock);
6dc3064a 1207 ret = send_consumer_relayd_sockets(LTTNG_DOMAIN_UST, session->id,
d3e2ba59
JD
1208 usess->consumer, socket,
1209 session->name, session->hostname,
6ef36453 1210 session->base_path,
b2c25d00 1211 session->live_timer,
0fb564b1 1212 current_chunk_id.is_set ? &current_chunk_id.value : NULL,
55ce50b6
MD
1213 session->creation_time,
1214 session->name_contains_creation_time);
2f77fc4b 1215 pthread_mutex_unlock(socket->lock);
f73fabfd 1216 if (ret != LTTNG_OK) {
2f77fc4b
DG
1217 goto error;
1218 }
6dc3064a
DG
1219 /* Session is now ready for network streaming. */
1220 session->net_handle = 1;
2f77fc4b 1221 }
b31610f2
JD
1222 session->consumer->relay_major_version =
1223 usess->consumer->relay_major_version;
1224 session->consumer->relay_minor_version =
1225 usess->consumer->relay_minor_version;
2f77fc4b
DG
1226 }
1227
1228 if (ksess && ksess->consumer && ksess->consumer->type == CONSUMER_DST_NET
1229 && ksess->consumer->enabled) {
1230 cds_lfht_for_each_entry(ksess->consumer->socks->ht, &iter.iter,
1231 socket, node.node) {
2f77fc4b 1232 pthread_mutex_lock(socket->lock);
6dc3064a 1233 ret = send_consumer_relayd_sockets(LTTNG_DOMAIN_KERNEL, session->id,
d3e2ba59
JD
1234 ksess->consumer, socket,
1235 session->name, session->hostname,
6ef36453 1236 session->base_path,
b2c25d00 1237 session->live_timer,
0fb564b1 1238 current_chunk_id.is_set ? &current_chunk_id.value : NULL,
55ce50b6
MD
1239 session->creation_time,
1240 session->name_contains_creation_time);
2f77fc4b 1241 pthread_mutex_unlock(socket->lock);
f73fabfd 1242 if (ret != LTTNG_OK) {
2f77fc4b
DG
1243 goto error;
1244 }
6dc3064a
DG
1245 /* Session is now ready for network streaming. */
1246 session->net_handle = 1;
2f77fc4b 1247 }
b31610f2
JD
1248 session->consumer->relay_major_version =
1249 ksess->consumer->relay_major_version;
1250 session->consumer->relay_minor_version =
1251 ksess->consumer->relay_minor_version;
2f77fc4b
DG
1252 }
1253
1254error:
e7fe706f 1255 rcu_read_unlock();
2f77fc4b
DG
1256 return ret;
1257}
1258
9b6c7ec5
DG
1259/*
1260 * Start a kernel session by opening all necessary streams.
1261 */
32e10baa 1262static int start_kernel_session(struct ltt_kernel_session *ksess)
9b6c7ec5
DG
1263{
1264 int ret;
1265 struct ltt_kernel_channel *kchan;
1266
1267 /* Open kernel metadata */
07b86b52 1268 if (ksess->metadata == NULL && ksess->output_traces) {
9b6c7ec5
DG
1269 ret = kernel_open_metadata(ksess);
1270 if (ret < 0) {
1271 ret = LTTNG_ERR_KERN_META_FAIL;
1272 goto error;
1273 }
1274 }
1275
1276 /* Open kernel metadata stream */
07b86b52 1277 if (ksess->metadata && ksess->metadata_stream_fd < 0) {
9b6c7ec5
DG
1278 ret = kernel_open_metadata_stream(ksess);
1279 if (ret < 0) {
1280 ERR("Kernel create metadata stream failed");
1281 ret = LTTNG_ERR_KERN_STREAM_FAIL;
1282 goto error;
1283 }
1284 }
1285
1286 /* For each channel */
1287 cds_list_for_each_entry(kchan, &ksess->channel_list.head, list) {
1288 if (kchan->stream_count == 0) {
1289 ret = kernel_open_channel_stream(kchan);
1290 if (ret < 0) {
1291 ret = LTTNG_ERR_KERN_STREAM_FAIL;
1292 goto error;
1293 }
1294 /* Update the stream global counter */
1295 ksess->stream_count_global += ret;
1296 }
1297 }
1298
1299 /* Setup kernel consumer socket and send fds to it */
1300 ret = init_kernel_tracing(ksess);
e43c41c5 1301 if (ret != 0) {
9b6c7ec5
DG
1302 ret = LTTNG_ERR_KERN_START_FAIL;
1303 goto error;
1304 }
1305
1306 /* This start the kernel tracing */
1307 ret = kernel_start_session(ksess);
1308 if (ret < 0) {
1309 ret = LTTNG_ERR_KERN_START_FAIL;
1310 goto error;
1311 }
1312
1313 /* Quiescent wait after starting trace */
32e10baa 1314 kernel_wait_quiescent();
9b6c7ec5 1315
14fb1ebe 1316 ksess->active = 1;
9b6c7ec5
DG
1317
1318 ret = LTTNG_OK;
1319
1320error:
1321 return ret;
1322}
1323
2f77fc4b
DG
1324/*
1325 * Command LTTNG_DISABLE_CHANNEL processed by the client thread.
1326 */
56a37563
JG
1327int cmd_disable_channel(struct ltt_session *session,
1328 enum lttng_domain_type domain, char *channel_name)
2f77fc4b
DG
1329{
1330 int ret;
1331 struct ltt_ust_session *usess;
1332
1333 usess = session->ust_session;
1334
2223c96f
DG
1335 rcu_read_lock();
1336
2f77fc4b
DG
1337 switch (domain) {
1338 case LTTNG_DOMAIN_KERNEL:
1339 {
1340 ret = channel_kernel_disable(session->kernel_session,
1341 channel_name);
f73fabfd 1342 if (ret != LTTNG_OK) {
2f77fc4b
DG
1343 goto error;
1344 }
1345
32e10baa 1346 kernel_wait_quiescent();
2f77fc4b
DG
1347 break;
1348 }
1349 case LTTNG_DOMAIN_UST:
1350 {
1351 struct ltt_ust_channel *uchan;
1352 struct lttng_ht *chan_ht;
1353
1354 chan_ht = usess->domain_global.channels;
1355
1356 uchan = trace_ust_find_channel_by_name(chan_ht, channel_name);
1357 if (uchan == NULL) {
f73fabfd 1358 ret = LTTNG_ERR_UST_CHAN_NOT_FOUND;
2f77fc4b
DG
1359 goto error;
1360 }
1361
7972aab2 1362 ret = channel_ust_disable(usess, uchan);
f73fabfd 1363 if (ret != LTTNG_OK) {
2f77fc4b
DG
1364 goto error;
1365 }
1366 break;
1367 }
2f77fc4b 1368 default:
f73fabfd 1369 ret = LTTNG_ERR_UNKNOWN_DOMAIN;
2f77fc4b
DG
1370 goto error;
1371 }
1372
f73fabfd 1373 ret = LTTNG_OK;
2f77fc4b
DG
1374
1375error:
2223c96f 1376 rcu_read_unlock();
2f77fc4b
DG
1377 return ret;
1378}
1379
ccf10263
MD
1380/*
1381 * Command LTTNG_TRACK_PID processed by the client thread.
a9ad0c8f
MD
1382 *
1383 * Called with session lock held.
ccf10263 1384 */
56a37563
JG
1385int cmd_track_pid(struct ltt_session *session, enum lttng_domain_type domain,
1386 int pid)
ccf10263
MD
1387{
1388 int ret;
1389
1390 rcu_read_lock();
1391
1392 switch (domain) {
1393 case LTTNG_DOMAIN_KERNEL:
1394 {
1395 struct ltt_kernel_session *ksess;
1396
1397 ksess = session->kernel_session;
1398
1399 ret = kernel_track_pid(ksess, pid);
1400 if (ret != LTTNG_OK) {
1401 goto error;
1402 }
1403
32e10baa 1404 kernel_wait_quiescent();
ccf10263
MD
1405 break;
1406 }
ccf10263 1407 case LTTNG_DOMAIN_UST:
a9ad0c8f
MD
1408 {
1409 struct ltt_ust_session *usess;
1410
1411 usess = session->ust_session;
1412
1413 ret = trace_ust_track_pid(usess, pid);
1414 if (ret != LTTNG_OK) {
1415 goto error;
1416 }
1417 break;
1418 }
ccf10263
MD
1419 default:
1420 ret = LTTNG_ERR_UNKNOWN_DOMAIN;
1421 goto error;
1422 }
1423
1424 ret = LTTNG_OK;
1425
1426error:
1427 rcu_read_unlock();
1428 return ret;
1429}
1430
1431/*
1432 * Command LTTNG_UNTRACK_PID processed by the client thread.
a9ad0c8f
MD
1433 *
1434 * Called with session lock held.
ccf10263 1435 */
56a37563
JG
1436int cmd_untrack_pid(struct ltt_session *session, enum lttng_domain_type domain,
1437 int pid)
ccf10263
MD
1438{
1439 int ret;
1440
1441 rcu_read_lock();
1442
1443 switch (domain) {
1444 case LTTNG_DOMAIN_KERNEL:
1445 {
1446 struct ltt_kernel_session *ksess;
1447
1448 ksess = session->kernel_session;
1449
1450 ret = kernel_untrack_pid(ksess, pid);
1451 if (ret != LTTNG_OK) {
1452 goto error;
1453 }
1454
32e10baa 1455 kernel_wait_quiescent();
ccf10263
MD
1456 break;
1457 }
ccf10263 1458 case LTTNG_DOMAIN_UST:
a9ad0c8f
MD
1459 {
1460 struct ltt_ust_session *usess;
1461
1462 usess = session->ust_session;
1463
1464 ret = trace_ust_untrack_pid(usess, pid);
1465 if (ret != LTTNG_OK) {
1466 goto error;
1467 }
1468 break;
1469 }
ccf10263
MD
1470 default:
1471 ret = LTTNG_ERR_UNKNOWN_DOMAIN;
1472 goto error;
1473 }
1474
1475 ret = LTTNG_OK;
1476
1477error:
1478 rcu_read_unlock();
1479 return ret;
1480}
1481
2f77fc4b
DG
1482/*
1483 * Command LTTNG_ENABLE_CHANNEL processed by the client thread.
1484 *
1485 * The wpipe arguments is used as a notifier for the kernel thread.
1486 */
1487int cmd_enable_channel(struct ltt_session *session,
6938db9c 1488 const struct lttng_domain *domain, const struct lttng_channel *_attr, int wpipe)
2f77fc4b
DG
1489{
1490 int ret;
1491 struct ltt_ust_session *usess = session->ust_session;
1492 struct lttng_ht *chan_ht;
1f345e94 1493 size_t len;
6938db9c 1494 struct lttng_channel attr;
2f77fc4b
DG
1495
1496 assert(session);
6938db9c 1497 assert(_attr);
7972aab2 1498 assert(domain);
2f77fc4b 1499
6938db9c
JG
1500 attr = *_attr;
1501 len = lttng_strnlen(attr.name, sizeof(attr.name));
1f345e94
PP
1502
1503 /* Validate channel name */
6938db9c
JG
1504 if (attr.name[0] == '.' ||
1505 memchr(attr.name, '/', len) != NULL) {
1f345e94
PP
1506 ret = LTTNG_ERR_INVALID_CHANNEL_NAME;
1507 goto end;
1508 }
1509
6938db9c 1510 DBG("Enabling channel %s for session %s", attr.name, session->name);
2f77fc4b 1511
03b4fdcf
DG
1512 rcu_read_lock();
1513
ecc48a90
JD
1514 /*
1515 * Don't try to enable a channel if the session has been started at
1516 * some point in time before. The tracer does not allow it.
1517 */
8382cf6f 1518 if (session->has_been_started) {
ecc48a90
JD
1519 ret = LTTNG_ERR_TRACE_ALREADY_STARTED;
1520 goto error;
1521 }
1522
1523 /*
1524 * If the session is a live session, remove the switch timer, the
1525 * live timer does the same thing but sends also synchronisation
1526 * beacons for inactive streams.
1527 */
1528 if (session->live_timer > 0) {
6938db9c
JG
1529 attr.attr.live_timer_interval = session->live_timer;
1530 attr.attr.switch_timer_interval = 0;
ecc48a90
JD
1531 }
1532
6e21424e
JR
1533 /* Check for feature support */
1534 switch (domain->type) {
1535 case LTTNG_DOMAIN_KERNEL:
1536 {
32e10baa 1537 if (kernel_supports_ring_buffer_snapshot_sample_positions() != 1) {
6e21424e
JR
1538 /* Sampling position of buffer is not supported */
1539 WARN("Kernel tracer does not support buffer monitoring. "
1540 "Setting the monitor interval timer to 0 "
1541 "(disabled) for channel '%s' of session '%s'",
6938db9c
JG
1542 attr.name, session->name);
1543 lttng_channel_set_monitor_timer_interval(&attr, 0);
6e21424e
JR
1544 }
1545 break;
1546 }
1547 case LTTNG_DOMAIN_UST:
f28f9e44 1548 break;
6e21424e
JR
1549 case LTTNG_DOMAIN_JUL:
1550 case LTTNG_DOMAIN_LOG4J:
1551 case LTTNG_DOMAIN_PYTHON:
f28f9e44
JG
1552 if (!agent_tracing_is_enabled()) {
1553 DBG("Attempted to enable a channel in an agent domain but the agent thread is not running");
1554 ret = LTTNG_ERR_AGENT_TRACING_DISABLED;
1555 goto error;
1556 }
6e21424e
JR
1557 break;
1558 default:
1559 ret = LTTNG_ERR_UNKNOWN_DOMAIN;
1560 goto error;
1561 }
1562
7972aab2 1563 switch (domain->type) {
2f77fc4b
DG
1564 case LTTNG_DOMAIN_KERNEL:
1565 {
1566 struct ltt_kernel_channel *kchan;
1567
6938db9c 1568 kchan = trace_kernel_get_channel_by_name(attr.name,
2f77fc4b
DG
1569 session->kernel_session);
1570 if (kchan == NULL) {
8954c04a
JG
1571 if (session->snapshot.nb_output > 0 ||
1572 session->snapshot_mode) {
1573 /* Enforce mmap output for snapshot sessions. */
6938db9c 1574 attr.attr.output = LTTNG_EVENT_MMAP;
8954c04a 1575 }
6938db9c
JG
1576 ret = channel_kernel_create(session->kernel_session, &attr, wpipe);
1577 if (attr.name[0] != '\0') {
85076754
MD
1578 session->kernel_session->has_non_default_channel = 1;
1579 }
2f77fc4b
DG
1580 } else {
1581 ret = channel_kernel_enable(session->kernel_session, kchan);
1582 }
1583
f73fabfd 1584 if (ret != LTTNG_OK) {
2f77fc4b
DG
1585 goto error;
1586 }
1587
32e10baa 1588 kernel_wait_quiescent();
2f77fc4b
DG
1589 break;
1590 }
1591 case LTTNG_DOMAIN_UST:
9232818f
JG
1592 case LTTNG_DOMAIN_JUL:
1593 case LTTNG_DOMAIN_LOG4J:
1594 case LTTNG_DOMAIN_PYTHON:
2f77fc4b
DG
1595 {
1596 struct ltt_ust_channel *uchan;
1597
9232818f
JG
1598 /*
1599 * FIXME
1600 *
1601 * Current agent implementation limitations force us to allow
1602 * only one channel at once in "agent" subdomains. Each
1603 * subdomain has a default channel name which must be strictly
1604 * adhered to.
1605 */
1606 if (domain->type == LTTNG_DOMAIN_JUL) {
6938db9c 1607 if (strncmp(attr.name, DEFAULT_JUL_CHANNEL_NAME,
9232818f
JG
1608 LTTNG_SYMBOL_NAME_LEN)) {
1609 ret = LTTNG_ERR_INVALID_CHANNEL_NAME;
1610 goto error;
1611 }
1612 } else if (domain->type == LTTNG_DOMAIN_LOG4J) {
6938db9c 1613 if (strncmp(attr.name, DEFAULT_LOG4J_CHANNEL_NAME,
9232818f
JG
1614 LTTNG_SYMBOL_NAME_LEN)) {
1615 ret = LTTNG_ERR_INVALID_CHANNEL_NAME;
1616 goto error;
1617 }
1618 } else if (domain->type == LTTNG_DOMAIN_PYTHON) {
6938db9c 1619 if (strncmp(attr.name, DEFAULT_PYTHON_CHANNEL_NAME,
9232818f
JG
1620 LTTNG_SYMBOL_NAME_LEN)) {
1621 ret = LTTNG_ERR_INVALID_CHANNEL_NAME;
1622 goto error;
1623 }
1624 }
1625
2f77fc4b
DG
1626 chan_ht = usess->domain_global.channels;
1627
6938db9c 1628 uchan = trace_ust_find_channel_by_name(chan_ht, attr.name);
2f77fc4b 1629 if (uchan == NULL) {
6938db9c
JG
1630 ret = channel_ust_create(usess, &attr, domain->buf_type);
1631 if (attr.name[0] != '\0') {
85076754
MD
1632 usess->has_non_default_channel = 1;
1633 }
2f77fc4b 1634 } else {
7972aab2 1635 ret = channel_ust_enable(usess, uchan);
2f77fc4b
DG
1636 }
1637 break;
1638 }
2f77fc4b 1639 default:
f73fabfd 1640 ret = LTTNG_ERR_UNKNOWN_DOMAIN;
2f77fc4b
DG
1641 goto error;
1642 }
1643
6938db9c 1644 if (ret == LTTNG_OK && attr.attr.output != LTTNG_EVENT_MMAP) {
8954c04a
JG
1645 session->has_non_mmap_channel = true;
1646 }
2f77fc4b 1647error:
2223c96f 1648 rcu_read_unlock();
1f345e94 1649end:
2f77fc4b
DG
1650 return ret;
1651}
1652
2f77fc4b
DG
1653/*
1654 * Command LTTNG_DISABLE_EVENT processed by the client thread.
1655 */
56a37563 1656int cmd_disable_event(struct ltt_session *session,
6938db9c
JG
1657 enum lttng_domain_type domain, const char *channel_name,
1658 const struct lttng_event *event)
2f77fc4b
DG
1659{
1660 int ret;
6938db9c 1661 const char *event_name;
6e911cad 1662
18a720cd
MD
1663 DBG("Disable event command for event \'%s\'", event->name);
1664
6e911cad
MD
1665 event_name = event->name;
1666
9b7431cf
JG
1667 /* Error out on unhandled search criteria */
1668 if (event->loglevel_type || event->loglevel != -1 || event->enabled
6e911cad 1669 || event->pid || event->filter || event->exclusion) {
7076b56e
JG
1670 ret = LTTNG_ERR_UNK;
1671 goto error;
6e911cad 1672 }
2f77fc4b 1673
2223c96f
DG
1674 rcu_read_lock();
1675
2f77fc4b
DG
1676 switch (domain) {
1677 case LTTNG_DOMAIN_KERNEL:
1678 {
1679 struct ltt_kernel_channel *kchan;
1680 struct ltt_kernel_session *ksess;
1681
1682 ksess = session->kernel_session;
1683
85076754
MD
1684 /*
1685 * If a non-default channel has been created in the
1686 * session, explicitely require that -c chan_name needs
1687 * to be provided.
1688 */
1689 if (ksess->has_non_default_channel && channel_name[0] == '\0') {
1690 ret = LTTNG_ERR_NEED_CHANNEL_NAME;
7076b56e 1691 goto error_unlock;
85076754
MD
1692 }
1693
2f77fc4b
DG
1694 kchan = trace_kernel_get_channel_by_name(channel_name, ksess);
1695 if (kchan == NULL) {
f73fabfd 1696 ret = LTTNG_ERR_KERN_CHAN_NOT_FOUND;
7076b56e 1697 goto error_unlock;
2f77fc4b
DG
1698 }
1699
6e911cad
MD
1700 switch (event->type) {
1701 case LTTNG_EVENT_ALL:
9550ee81 1702 case LTTNG_EVENT_TRACEPOINT:
d0ae4ea8 1703 case LTTNG_EVENT_SYSCALL:
9550ee81
JR
1704 case LTTNG_EVENT_PROBE:
1705 case LTTNG_EVENT_FUNCTION:
1706 case LTTNG_EVENT_FUNCTION_ENTRY:/* fall-through */
1707 if (event_name[0] == '\0') {
1708 ret = event_kernel_disable_event(kchan,
1709 NULL, event->type);
29c62722 1710 } else {
d0ae4ea8 1711 ret = event_kernel_disable_event(kchan,
9550ee81 1712 event_name, event->type);
29c62722 1713 }
6e911cad 1714 if (ret != LTTNG_OK) {
7076b56e 1715 goto error_unlock;
6e911cad
MD
1716 }
1717 break;
6e911cad
MD
1718 default:
1719 ret = LTTNG_ERR_UNK;
7076b56e 1720 goto error_unlock;
2f77fc4b
DG
1721 }
1722
32e10baa 1723 kernel_wait_quiescent();
2f77fc4b
DG
1724 break;
1725 }
1726 case LTTNG_DOMAIN_UST:
1727 {
1728 struct ltt_ust_channel *uchan;
1729 struct ltt_ust_session *usess;
1730
1731 usess = session->ust_session;
1732
7076b56e
JG
1733 if (validate_ust_event_name(event_name)) {
1734 ret = LTTNG_ERR_INVALID_EVENT_NAME;
1735 goto error_unlock;
1736 }
1737
85076754
MD
1738 /*
1739 * If a non-default channel has been created in the
9550ee81 1740 * session, explicitly require that -c chan_name needs
85076754
MD
1741 * to be provided.
1742 */
1743 if (usess->has_non_default_channel && channel_name[0] == '\0') {
1744 ret = LTTNG_ERR_NEED_CHANNEL_NAME;
7076b56e 1745 goto error_unlock;
85076754
MD
1746 }
1747
2f77fc4b
DG
1748 uchan = trace_ust_find_channel_by_name(usess->domain_global.channels,
1749 channel_name);
1750 if (uchan == NULL) {
f73fabfd 1751 ret = LTTNG_ERR_UST_CHAN_NOT_FOUND;
7076b56e 1752 goto error_unlock;
2f77fc4b
DG
1753 }
1754
6e911cad
MD
1755 switch (event->type) {
1756 case LTTNG_EVENT_ALL:
b3639870
JR
1757 /*
1758 * An empty event name means that everything
1759 * should be disabled.
1760 */
1761 if (event->name[0] == '\0') {
1762 ret = event_ust_disable_all_tracepoints(usess, uchan);
77d536b2
JR
1763 } else {
1764 ret = event_ust_disable_tracepoint(usess, uchan,
1765 event_name);
1766 }
6e911cad 1767 if (ret != LTTNG_OK) {
7076b56e 1768 goto error_unlock;
6e911cad
MD
1769 }
1770 break;
1771 default:
1772 ret = LTTNG_ERR_UNK;
7076b56e 1773 goto error_unlock;
2f77fc4b
DG
1774 }
1775
1776 DBG3("Disable UST event %s in channel %s completed", event_name,
1777 channel_name);
1778 break;
1779 }
5cdb6027 1780 case LTTNG_DOMAIN_LOG4J:
f20baf8e 1781 case LTTNG_DOMAIN_JUL:
0e115563 1782 case LTTNG_DOMAIN_PYTHON:
f20baf8e 1783 {
fefd409b 1784 struct agent *agt;
f20baf8e
DG
1785 struct ltt_ust_session *usess = session->ust_session;
1786
1787 assert(usess);
1788
6e911cad
MD
1789 switch (event->type) {
1790 case LTTNG_EVENT_ALL:
1791 break;
1792 default:
1793 ret = LTTNG_ERR_UNK;
7076b56e 1794 goto error_unlock;
6e911cad
MD
1795 }
1796
5cdb6027 1797 agt = trace_ust_find_agent(usess, domain);
fefd409b
DG
1798 if (!agt) {
1799 ret = -LTTNG_ERR_UST_EVENT_NOT_FOUND;
7076b56e 1800 goto error_unlock;
fefd409b 1801 }
b3639870
JR
1802 /*
1803 * An empty event name means that everything
1804 * should be disabled.
1805 */
1806 if (event->name[0] == '\0') {
18a720cd
MD
1807 ret = event_agent_disable_all(usess, agt);
1808 } else {
1809 ret = event_agent_disable(usess, agt, event_name);
1810 }
f20baf8e 1811 if (ret != LTTNG_OK) {
7076b56e 1812 goto error_unlock;
f20baf8e
DG
1813 }
1814
1815 break;
1816 }
2f77fc4b 1817 default:
f73fabfd 1818 ret = LTTNG_ERR_UND;
7076b56e 1819 goto error_unlock;
2f77fc4b
DG
1820 }
1821
f73fabfd 1822 ret = LTTNG_OK;
2f77fc4b 1823
7076b56e 1824error_unlock:
2223c96f 1825 rcu_read_unlock();
7076b56e 1826error:
2f77fc4b
DG
1827 return ret;
1828}
1829
2f77fc4b
DG
1830/*
1831 * Command LTTNG_ADD_CONTEXT processed by the client thread.
1832 */
56a37563 1833int cmd_add_context(struct ltt_session *session, enum lttng_domain_type domain,
6938db9c 1834 char *channel_name, const struct lttng_event_context *ctx, int kwpipe)
2f77fc4b 1835{
d5979e4a 1836 int ret, chan_kern_created = 0, chan_ust_created = 0;
bdf64013
JG
1837 char *app_ctx_provider_name = NULL, *app_ctx_name = NULL;
1838
9a699f7b
JR
1839 /*
1840 * Don't try to add a context if the session has been started at
1841 * some point in time before. The tracer does not allow it and would
1842 * result in a corrupted trace.
1843 */
1844 if (session->has_been_started) {
1845 ret = LTTNG_ERR_TRACE_ALREADY_STARTED;
1846 goto end;
1847 }
1848
bdf64013
JG
1849 if (ctx->ctx == LTTNG_EVENT_CONTEXT_APP_CONTEXT) {
1850 app_ctx_provider_name = ctx->u.app_ctx.provider_name;
1851 app_ctx_name = ctx->u.app_ctx.ctx_name;
1852 }
2f77fc4b
DG
1853
1854 switch (domain) {
1855 case LTTNG_DOMAIN_KERNEL:
979e618e
DG
1856 assert(session->kernel_session);
1857
1858 if (session->kernel_session->channel_count == 0) {
1859 /* Create default channel */
1860 ret = channel_kernel_create(session->kernel_session, NULL, kwpipe);
1861 if (ret != LTTNG_OK) {
1862 goto error;
1863 }
d5979e4a 1864 chan_kern_created = 1;
979e618e 1865 }
2f77fc4b 1866 /* Add kernel context to kernel tracer */
601d5acf 1867 ret = context_kernel_add(session->kernel_session, ctx, channel_name);
f73fabfd 1868 if (ret != LTTNG_OK) {
2f77fc4b
DG
1869 goto error;
1870 }
1871 break;
bdf64013
JG
1872 case LTTNG_DOMAIN_JUL:
1873 case LTTNG_DOMAIN_LOG4J:
1874 {
1875 /*
1876 * Validate channel name.
1877 * If no channel name is given and the domain is JUL or LOG4J,
1878 * set it to the appropriate domain-specific channel name. If
1879 * a name is provided but does not match the expexted channel
1880 * name, return an error.
1881 */
1882 if (domain == LTTNG_DOMAIN_JUL && *channel_name &&
1883 strcmp(channel_name,
1884 DEFAULT_JUL_CHANNEL_NAME)) {
1885 ret = LTTNG_ERR_UST_CHAN_NOT_FOUND;
1886 goto error;
1887 } else if (domain == LTTNG_DOMAIN_LOG4J && *channel_name &&
1888 strcmp(channel_name,
1889 DEFAULT_LOG4J_CHANNEL_NAME)) {
1890 ret = LTTNG_ERR_UST_CHAN_NOT_FOUND;
1891 goto error;
1892 }
a93b3916 1893 /* break is _not_ missing here. */
bdf64013 1894 }
2f77fc4b
DG
1895 case LTTNG_DOMAIN_UST:
1896 {
1897 struct ltt_ust_session *usess = session->ust_session;
85076754
MD
1898 unsigned int chan_count;
1899
2f77fc4b
DG
1900 assert(usess);
1901
85076754 1902 chan_count = lttng_ht_get_count(usess->domain_global.channels);
979e618e
DG
1903 if (chan_count == 0) {
1904 struct lttng_channel *attr;
1905 /* Create default channel */
0a9c6494 1906 attr = channel_new_default_attr(domain, usess->buffer_type);
979e618e
DG
1907 if (attr == NULL) {
1908 ret = LTTNG_ERR_FATAL;
1909 goto error;
1910 }
1911
7972aab2 1912 ret = channel_ust_create(usess, attr, usess->buffer_type);
979e618e
DG
1913 if (ret != LTTNG_OK) {
1914 free(attr);
1915 goto error;
1916 }
cf0bcb51 1917 channel_attr_destroy(attr);
d5979e4a 1918 chan_ust_created = 1;
979e618e
DG
1919 }
1920
601d5acf 1921 ret = context_ust_add(usess, domain, ctx, channel_name);
bdf64013
JG
1922 free(app_ctx_provider_name);
1923 free(app_ctx_name);
1924 app_ctx_name = NULL;
1925 app_ctx_provider_name = NULL;
f73fabfd 1926 if (ret != LTTNG_OK) {
2f77fc4b
DG
1927 goto error;
1928 }
1929 break;
1930 }
2f77fc4b 1931 default:
f73fabfd 1932 ret = LTTNG_ERR_UND;
2f77fc4b
DG
1933 goto error;
1934 }
1935
bdf64013
JG
1936 ret = LTTNG_OK;
1937 goto end;
2f77fc4b
DG
1938
1939error:
d5979e4a
DG
1940 if (chan_kern_created) {
1941 struct ltt_kernel_channel *kchan =
1942 trace_kernel_get_channel_by_name(DEFAULT_CHANNEL_NAME,
1943 session->kernel_session);
1944 /* Created previously, this should NOT fail. */
1945 assert(kchan);
1946 kernel_destroy_channel(kchan);
1947 }
1948
1949 if (chan_ust_created) {
1950 struct ltt_ust_channel *uchan =
1951 trace_ust_find_channel_by_name(
1952 session->ust_session->domain_global.channels,
1953 DEFAULT_CHANNEL_NAME);
1954 /* Created previously, this should NOT fail. */
1955 assert(uchan);
1956 /* Remove from the channel list of the session. */
1957 trace_ust_delete_channel(session->ust_session->domain_global.channels,
1958 uchan);
1959 trace_ust_destroy_channel(uchan);
1960 }
bdf64013
JG
1961end:
1962 free(app_ctx_provider_name);
1963 free(app_ctx_name);
2f77fc4b
DG
1964 return ret;
1965}
1966
dac8e046
JG
1967static inline bool name_starts_with(const char *name, const char *prefix)
1968{
1969 const size_t max_cmp_len = min(strlen(prefix), LTTNG_SYMBOL_NAME_LEN);
1970
1971 return !strncmp(name, prefix, max_cmp_len);
1972}
1973
1974/* Perform userspace-specific event name validation */
1975static int validate_ust_event_name(const char *name)
1976{
1977 int ret = 0;
1978
1979 if (!name) {
1980 ret = -1;
1981 goto end;
1982 }
1983
1984 /*
1985 * Check name against all internal UST event component namespaces used
1986 * by the agents.
1987 */
1988 if (name_starts_with(name, DEFAULT_JUL_EVENT_COMPONENT) ||
1989 name_starts_with(name, DEFAULT_LOG4J_EVENT_COMPONENT) ||
1990 name_starts_with(name, DEFAULT_PYTHON_EVENT_COMPONENT)) {
1991 ret = -1;
1992 }
1993
1994end:
1995 return ret;
1996}
88f06f15 1997
2f77fc4b 1998/*
88f06f15
JG
1999 * Internal version of cmd_enable_event() with a supplemental
2000 * "internal_event" flag which is used to enable internal events which should
2001 * be hidden from clients. Such events are used in the agent implementation to
2002 * enable the events through which all "agent" events are funeled.
2f77fc4b 2003 */
88f06f15 2004static int _cmd_enable_event(struct ltt_session *session,
6938db9c 2005 const struct lttng_domain *domain,
025faf73 2006 char *channel_name, struct lttng_event *event,
6b453b5e 2007 char *filter_expression,
db8f1377
JI
2008 struct lttng_filter_bytecode *filter,
2009 struct lttng_event_exclusion *exclusion,
88f06f15 2010 int wpipe, bool internal_event)
2f77fc4b 2011{
9f449915 2012 int ret = 0, channel_created = 0;
cfedea03 2013 struct lttng_channel *attr = NULL;
2f77fc4b
DG
2014
2015 assert(session);
2016 assert(event);
2017 assert(channel_name);
2018
2a385866
JG
2019 /* If we have a filter, we must have its filter expression */
2020 assert(!(!!filter_expression ^ !!filter));
2021
9f449915
PP
2022 /* Normalize event name as a globbing pattern */
2023 strutils_normalize_star_glob_pattern(event->name);
18a720cd 2024
9f449915
PP
2025 /* Normalize exclusion names as globbing patterns */
2026 if (exclusion) {
2027 size_t i;
f5ac4bd7 2028
9f449915
PP
2029 for (i = 0; i < exclusion->count; i++) {
2030 char *name = LTTNG_EVENT_EXCLUSION_NAME_AT(exclusion, i);
2031
2032 strutils_normalize_star_glob_pattern(name);
2033 }
930a2e99
JG
2034 }
2035
9f449915
PP
2036 DBG("Enable event command for event \'%s\'", event->name);
2037
2038 rcu_read_lock();
2039
7972aab2 2040 switch (domain->type) {
2f77fc4b
DG
2041 case LTTNG_DOMAIN_KERNEL:
2042 {
2043 struct ltt_kernel_channel *kchan;
2044
85076754
MD
2045 /*
2046 * If a non-default channel has been created in the
2047 * session, explicitely require that -c chan_name needs
2048 * to be provided.
2049 */
2050 if (session->kernel_session->has_non_default_channel
2051 && channel_name[0] == '\0') {
2052 ret = LTTNG_ERR_NEED_CHANNEL_NAME;
2053 goto error;
2054 }
2055
2f77fc4b
DG
2056 kchan = trace_kernel_get_channel_by_name(channel_name,
2057 session->kernel_session);
2058 if (kchan == NULL) {
0a9c6494
DG
2059 attr = channel_new_default_attr(LTTNG_DOMAIN_KERNEL,
2060 LTTNG_BUFFER_GLOBAL);
2f77fc4b 2061 if (attr == NULL) {
f73fabfd 2062 ret = LTTNG_ERR_FATAL;
2f77fc4b
DG
2063 goto error;
2064 }
04c17253
MD
2065 if (lttng_strncpy(attr->name, channel_name,
2066 sizeof(attr->name))) {
2067 ret = LTTNG_ERR_INVALID;
04c17253
MD
2068 goto error;
2069 }
2f77fc4b
DG
2070
2071 ret = cmd_enable_channel(session, domain, attr, wpipe);
f73fabfd 2072 if (ret != LTTNG_OK) {
2f77fc4b
DG
2073 goto error;
2074 }
e5f5db7f 2075 channel_created = 1;
2f77fc4b
DG
2076 }
2077
2078 /* Get the newly created kernel channel pointer */
2079 kchan = trace_kernel_get_channel_by_name(channel_name,
2080 session->kernel_session);
2081 if (kchan == NULL) {
2082 /* This sould not happen... */
f73fabfd 2083 ret = LTTNG_ERR_FATAL;
2f77fc4b
DG
2084 goto error;
2085 }
2086
6e911cad
MD
2087 switch (event->type) {
2088 case LTTNG_EVENT_ALL:
29c62722 2089 {
00a62084
MD
2090 char *filter_expression_a = NULL;
2091 struct lttng_filter_bytecode *filter_a = NULL;
2092
2093 /*
2094 * We need to duplicate filter_expression and filter,
2095 * because ownership is passed to first enable
2096 * event.
2097 */
2098 if (filter_expression) {
2099 filter_expression_a = strdup(filter_expression);
2100 if (!filter_expression_a) {
2101 ret = LTTNG_ERR_FATAL;
2102 goto error;
2103 }
2104 }
2105 if (filter) {
2106 filter_a = zmalloc(sizeof(*filter_a) + filter->len);
2107 if (!filter_a) {
2108 free(filter_expression_a);
2109 ret = LTTNG_ERR_FATAL;
2110 goto error;
2111 }
2112 memcpy(filter_a, filter, sizeof(*filter_a) + filter->len);
2113 }
29c62722 2114 event->type = LTTNG_EVENT_TRACEPOINT; /* Hack */
00a62084
MD
2115 ret = event_kernel_enable_event(kchan, event,
2116 filter_expression, filter);
a969e101
MD
2117 /* We have passed ownership */
2118 filter_expression = NULL;
2119 filter = NULL;
29c62722
MD
2120 if (ret != LTTNG_OK) {
2121 if (channel_created) {
2122 /* Let's not leak a useless channel. */
2123 kernel_destroy_channel(kchan);
2124 }
00a62084
MD
2125 free(filter_expression_a);
2126 free(filter_a);
29c62722
MD
2127 goto error;
2128 }
2129 event->type = LTTNG_EVENT_SYSCALL; /* Hack */
00a62084
MD
2130 ret = event_kernel_enable_event(kchan, event,
2131 filter_expression_a, filter_a);
60d21fa2
AB
2132 /* We have passed ownership */
2133 filter_expression_a = NULL;
2134 filter_a = NULL;
29c62722
MD
2135 if (ret != LTTNG_OK) {
2136 goto error;
2137 }
2138 break;
2139 }
6e6ef3d7 2140 case LTTNG_EVENT_PROBE:
dcabc190 2141 case LTTNG_EVENT_USERSPACE_PROBE:
6e6ef3d7
DG
2142 case LTTNG_EVENT_FUNCTION:
2143 case LTTNG_EVENT_FUNCTION_ENTRY:
6e911cad 2144 case LTTNG_EVENT_TRACEPOINT:
00a62084
MD
2145 ret = event_kernel_enable_event(kchan, event,
2146 filter_expression, filter);
a969e101
MD
2147 /* We have passed ownership */
2148 filter_expression = NULL;
2149 filter = NULL;
6e911cad
MD
2150 if (ret != LTTNG_OK) {
2151 if (channel_created) {
2152 /* Let's not leak a useless channel. */
2153 kernel_destroy_channel(kchan);
2154 }
2155 goto error;
e5f5db7f 2156 }
6e911cad
MD
2157 break;
2158 case LTTNG_EVENT_SYSCALL:
00a62084
MD
2159 ret = event_kernel_enable_event(kchan, event,
2160 filter_expression, filter);
a969e101
MD
2161 /* We have passed ownership */
2162 filter_expression = NULL;
2163 filter = NULL;
e2b957af
MD
2164 if (ret != LTTNG_OK) {
2165 goto error;
2166 }
6e911cad
MD
2167 break;
2168 default:
2169 ret = LTTNG_ERR_UNK;
2f77fc4b
DG
2170 goto error;
2171 }
2172
32e10baa 2173 kernel_wait_quiescent();
2f77fc4b
DG
2174 break;
2175 }
2176 case LTTNG_DOMAIN_UST:
2177 {
2178 struct ltt_ust_channel *uchan;
2179 struct ltt_ust_session *usess = session->ust_session;
2180
2181 assert(usess);
2182
85076754
MD
2183 /*
2184 * If a non-default channel has been created in the
2185 * session, explicitely require that -c chan_name needs
2186 * to be provided.
2187 */
2188 if (usess->has_non_default_channel && channel_name[0] == '\0') {
2189 ret = LTTNG_ERR_NEED_CHANNEL_NAME;
2190 goto error;
2191 }
2192
2f77fc4b
DG
2193 /* Get channel from global UST domain */
2194 uchan = trace_ust_find_channel_by_name(usess->domain_global.channels,
2195 channel_name);
2196 if (uchan == NULL) {
2197 /* Create default channel */
0a9c6494
DG
2198 attr = channel_new_default_attr(LTTNG_DOMAIN_UST,
2199 usess->buffer_type);
2f77fc4b 2200 if (attr == NULL) {
f73fabfd 2201 ret = LTTNG_ERR_FATAL;
2f77fc4b
DG
2202 goto error;
2203 }
04c17253
MD
2204 if (lttng_strncpy(attr->name, channel_name,
2205 sizeof(attr->name))) {
2206 ret = LTTNG_ERR_INVALID;
04c17253
MD
2207 goto error;
2208 }
2f77fc4b
DG
2209
2210 ret = cmd_enable_channel(session, domain, attr, wpipe);
f73fabfd 2211 if (ret != LTTNG_OK) {
2f77fc4b
DG
2212 goto error;
2213 }
2f77fc4b
DG
2214
2215 /* Get the newly created channel reference back */
2216 uchan = trace_ust_find_channel_by_name(
2217 usess->domain_global.channels, channel_name);
2218 assert(uchan);
2219 }
2220
141feb8c
JG
2221 if (uchan->domain != LTTNG_DOMAIN_UST && !internal_event) {
2222 /*
2223 * Don't allow users to add UST events to channels which
2224 * are assigned to a userspace subdomain (JUL, Log4J,
2225 * Python, etc.).
2226 */
2227 ret = LTTNG_ERR_INVALID_CHANNEL_DOMAIN;
2228 goto error;
2229 }
2230
dac8e046
JG
2231 if (!internal_event) {
2232 /*
2233 * Ensure the event name is not reserved for internal
2234 * use.
2235 */
2236 ret = validate_ust_event_name(event->name);
2237 if (ret) {
2238 WARN("Userspace event name %s failed validation.",
bbcab087 2239 event->name);
dac8e046
JG
2240 ret = LTTNG_ERR_INVALID_EVENT_NAME;
2241 goto error;
2242 }
2243 }
2244
2f77fc4b 2245 /* At this point, the session and channel exist on the tracer */
6b453b5e 2246 ret = event_ust_enable_tracepoint(usess, uchan, event,
88f06f15
JG
2247 filter_expression, filter, exclusion,
2248 internal_event);
49d21f93
MD
2249 /* We have passed ownership */
2250 filter_expression = NULL;
2251 filter = NULL;
2252 exclusion = NULL;
94382e15
JG
2253 if (ret == LTTNG_ERR_UST_EVENT_ENABLED) {
2254 goto already_enabled;
2255 } else if (ret != LTTNG_OK) {
2f77fc4b
DG
2256 goto error;
2257 }
2258 break;
2259 }
5cdb6027 2260 case LTTNG_DOMAIN_LOG4J:
f20baf8e 2261 case LTTNG_DOMAIN_JUL:
0e115563 2262 case LTTNG_DOMAIN_PYTHON:
f20baf8e 2263 {
da6c3a50 2264 const char *default_event_name, *default_chan_name;
fefd409b 2265 struct agent *agt;
f20baf8e
DG
2266 struct lttng_event uevent;
2267 struct lttng_domain tmp_dom;
2268 struct ltt_ust_session *usess = session->ust_session;
2269
2270 assert(usess);
2271
f28f9e44
JG
2272 if (!agent_tracing_is_enabled()) {
2273 DBG("Attempted to enable an event in an agent domain but the agent thread is not running");
2274 ret = LTTNG_ERR_AGENT_TRACING_DISABLED;
2275 goto error;
2276 }
2277
5cdb6027 2278 agt = trace_ust_find_agent(usess, domain->type);
fefd409b 2279 if (!agt) {
5cdb6027 2280 agt = agent_create(domain->type);
fefd409b 2281 if (!agt) {
e5b3c48c 2282 ret = LTTNG_ERR_NOMEM;
fefd409b
DG
2283 goto error;
2284 }
2285 agent_add(agt, usess->agents);
2286 }
2287
022d91ba 2288 /* Create the default tracepoint. */
996de3c7 2289 memset(&uevent, 0, sizeof(uevent));
f20baf8e
DG
2290 uevent.type = LTTNG_EVENT_TRACEPOINT;
2291 uevent.loglevel_type = LTTNG_EVENT_LOGLEVEL_ALL;
51755dc8
JG
2292 default_event_name = event_get_default_agent_ust_name(
2293 domain->type);
da6c3a50 2294 if (!default_event_name) {
e5b3c48c 2295 ret = LTTNG_ERR_FATAL;
da6c3a50 2296 goto error;
f43f95a9 2297 }
da6c3a50 2298 strncpy(uevent.name, default_event_name, sizeof(uevent.name));
f20baf8e
DG
2299 uevent.name[sizeof(uevent.name) - 1] = '\0';
2300
2301 /*
2302 * The domain type is changed because we are about to enable the
2303 * default channel and event for the JUL domain that are hardcoded.
2304 * This happens in the UST domain.
2305 */
2306 memcpy(&tmp_dom, domain, sizeof(tmp_dom));
2307 tmp_dom.type = LTTNG_DOMAIN_UST;
2308
0e115563
DG
2309 switch (domain->type) {
2310 case LTTNG_DOMAIN_LOG4J:
da6c3a50 2311 default_chan_name = DEFAULT_LOG4J_CHANNEL_NAME;
0e115563
DG
2312 break;
2313 case LTTNG_DOMAIN_JUL:
da6c3a50 2314 default_chan_name = DEFAULT_JUL_CHANNEL_NAME;
0e115563
DG
2315 break;
2316 case LTTNG_DOMAIN_PYTHON:
2317 default_chan_name = DEFAULT_PYTHON_CHANNEL_NAME;
2318 break;
2319 default:
e98a44b0 2320 /* The switch/case we are in makes this impossible */
0e115563 2321 assert(0);
da6c3a50
DG
2322 }
2323
971da06a 2324 {
8404118c 2325 char *filter_expression_copy = NULL;
51755dc8 2326 struct lttng_filter_bytecode *filter_copy = NULL;
971da06a
JG
2327
2328 if (filter) {
51755dc8
JG
2329 const size_t filter_size = sizeof(
2330 struct lttng_filter_bytecode)
2331 + filter->len;
2332
2333 filter_copy = zmalloc(filter_size);
971da06a 2334 if (!filter_copy) {
018096a4 2335 ret = LTTNG_ERR_NOMEM;
b742e3e2 2336 goto error;
971da06a 2337 }
51755dc8 2338 memcpy(filter_copy, filter, filter_size);
971da06a 2339
8404118c
JG
2340 filter_expression_copy =
2341 strdup(filter_expression);
2342 if (!filter_expression) {
2343 ret = LTTNG_ERR_NOMEM;
51755dc8
JG
2344 }
2345
2346 if (!filter_expression_copy || !filter_copy) {
2347 free(filter_expression_copy);
2348 free(filter_copy);
2349 goto error;
8404118c 2350 }
971da06a
JG
2351 }
2352
88f06f15 2353 ret = cmd_enable_event_internal(session, &tmp_dom,
971da06a 2354 (char *) default_chan_name,
8404118c
JG
2355 &uevent, filter_expression_copy,
2356 filter_copy, NULL, wpipe);
971da06a
JG
2357 }
2358
94382e15
JG
2359 if (ret == LTTNG_ERR_UST_EVENT_ENABLED) {
2360 goto already_enabled;
2361 } else if (ret != LTTNG_OK) {
f20baf8e
DG
2362 goto error;
2363 }
2364
2365 /* The wild card * means that everything should be enabled. */
2366 if (strncmp(event->name, "*", 1) == 0 && strlen(event->name) == 1) {
8404118c
JG
2367 ret = event_agent_enable_all(usess, agt, event, filter,
2368 filter_expression);
f20baf8e 2369 } else {
8404118c
JG
2370 ret = event_agent_enable(usess, agt, event, filter,
2371 filter_expression);
f20baf8e 2372 }
51755dc8
JG
2373 filter = NULL;
2374 filter_expression = NULL;
f20baf8e
DG
2375 if (ret != LTTNG_OK) {
2376 goto error;
2377 }
2378
2379 break;
2380 }
2f77fc4b 2381 default:
f73fabfd 2382 ret = LTTNG_ERR_UND;
2f77fc4b
DG
2383 goto error;
2384 }
2385
f73fabfd 2386 ret = LTTNG_OK;
2f77fc4b 2387
94382e15 2388already_enabled:
2f77fc4b 2389error:
49d21f93
MD
2390 free(filter_expression);
2391 free(filter);
2392 free(exclusion);
cf0bcb51 2393 channel_attr_destroy(attr);
2223c96f 2394 rcu_read_unlock();
2f77fc4b
DG
2395 return ret;
2396}
2397
88f06f15
JG
2398/*
2399 * Command LTTNG_ENABLE_EVENT processed by the client thread.
2400 * We own filter, exclusion, and filter_expression.
2401 */
6938db9c
JG
2402int cmd_enable_event(struct ltt_session *session,
2403 const struct lttng_domain *domain,
88f06f15
JG
2404 char *channel_name, struct lttng_event *event,
2405 char *filter_expression,
2406 struct lttng_filter_bytecode *filter,
2407 struct lttng_event_exclusion *exclusion,
2408 int wpipe)
2409{
2410 return _cmd_enable_event(session, domain, channel_name, event,
2411 filter_expression, filter, exclusion, wpipe, false);
2412}
2413
2414/*
2415 * Enable an event which is internal to LTTng. An internal should
2416 * never be made visible to clients and are immune to checks such as
2417 * reserved names.
2418 */
2419static int cmd_enable_event_internal(struct ltt_session *session,
6938db9c 2420 const struct lttng_domain *domain,
88f06f15
JG
2421 char *channel_name, struct lttng_event *event,
2422 char *filter_expression,
2423 struct lttng_filter_bytecode *filter,
2424 struct lttng_event_exclusion *exclusion,
2425 int wpipe)
2426{
2427 return _cmd_enable_event(session, domain, channel_name, event,
2428 filter_expression, filter, exclusion, wpipe, true);
2429}
2430
2f77fc4b
DG
2431/*
2432 * Command LTTNG_LIST_TRACEPOINTS processed by the client thread.
2433 */
56a37563
JG
2434ssize_t cmd_list_tracepoints(enum lttng_domain_type domain,
2435 struct lttng_event **events)
2f77fc4b
DG
2436{
2437 int ret;
2438 ssize_t nb_events = 0;
2439
2440 switch (domain) {
2441 case LTTNG_DOMAIN_KERNEL:
32e10baa 2442 nb_events = kernel_list_events(events);
2f77fc4b 2443 if (nb_events < 0) {
f73fabfd 2444 ret = LTTNG_ERR_KERN_LIST_FAIL;
2f77fc4b
DG
2445 goto error;
2446 }
2447 break;
2448 case LTTNG_DOMAIN_UST:
2449 nb_events = ust_app_list_events(events);
2450 if (nb_events < 0) {
f73fabfd 2451 ret = LTTNG_ERR_UST_LIST_FAIL;
2f77fc4b
DG
2452 goto error;
2453 }
2454 break;
5cdb6027 2455 case LTTNG_DOMAIN_LOG4J:
3c6a091f 2456 case LTTNG_DOMAIN_JUL:
0e115563 2457 case LTTNG_DOMAIN_PYTHON:
f60140a1 2458 nb_events = agent_list_events(events, domain);
3c6a091f
DG
2459 if (nb_events < 0) {
2460 ret = LTTNG_ERR_UST_LIST_FAIL;
2461 goto error;
2462 }
2463 break;
2f77fc4b 2464 default:
f73fabfd 2465 ret = LTTNG_ERR_UND;
2f77fc4b
DG
2466 goto error;
2467 }
2468
2469 return nb_events;
2470
2471error:
2472 /* Return negative value to differentiate return code */
2473 return -ret;
2474}
2475
2476/*
2477 * Command LTTNG_LIST_TRACEPOINT_FIELDS processed by the client thread.
2478 */
56a37563 2479ssize_t cmd_list_tracepoint_fields(enum lttng_domain_type domain,
2f77fc4b
DG
2480 struct lttng_event_field **fields)
2481{
2482 int ret;
2483 ssize_t nb_fields = 0;
2484
2485 switch (domain) {
2486 case LTTNG_DOMAIN_UST:
2487 nb_fields = ust_app_list_event_fields(fields);
2488 if (nb_fields < 0) {
f73fabfd 2489 ret = LTTNG_ERR_UST_LIST_FAIL;
2f77fc4b
DG
2490 goto error;
2491 }
2492 break;
2493 case LTTNG_DOMAIN_KERNEL:
2494 default: /* fall-through */
f73fabfd 2495 ret = LTTNG_ERR_UND;
2f77fc4b
DG
2496 goto error;
2497 }
2498
2499 return nb_fields;
2500
2501error:
2502 /* Return negative value to differentiate return code */
2503 return -ret;
2504}
2505
834978fd
DG
2506ssize_t cmd_list_syscalls(struct lttng_event **events)
2507{
2508 return syscall_table_list(events);
2509}
2510
a5dfbb9d
MD
2511/*
2512 * Command LTTNG_LIST_TRACKER_PIDS processed by the client thread.
2513 *
2514 * Called with session lock held.
2515 */
2516ssize_t cmd_list_tracker_pids(struct ltt_session *session,
56a37563 2517 enum lttng_domain_type domain, int32_t **pids)
a5dfbb9d
MD
2518{
2519 int ret;
2520 ssize_t nr_pids = 0;
2521
2522 switch (domain) {
2523 case LTTNG_DOMAIN_KERNEL:
2524 {
2525 struct ltt_kernel_session *ksess;
2526
2527 ksess = session->kernel_session;
2528 nr_pids = kernel_list_tracker_pids(ksess, pids);
2529 if (nr_pids < 0) {
2530 ret = LTTNG_ERR_KERN_LIST_FAIL;
2531 goto error;
2532 }
2533 break;
2534 }
2535 case LTTNG_DOMAIN_UST:
2536 {
2537 struct ltt_ust_session *usess;
2538
2539 usess = session->ust_session;
2540 nr_pids = trace_ust_list_tracker_pids(usess, pids);
2541 if (nr_pids < 0) {
2542 ret = LTTNG_ERR_UST_LIST_FAIL;
2543 goto error;
2544 }
2545 break;
2546 }
2547 case LTTNG_DOMAIN_LOG4J:
2548 case LTTNG_DOMAIN_JUL:
2549 case LTTNG_DOMAIN_PYTHON:
2550 default:
2551 ret = LTTNG_ERR_UND;
2552 goto error;
2553 }
2554
2555 return nr_pids;
2556
2557error:
2558 /* Return negative value to differentiate return code */
2559 return -ret;
2560}
2561
2f77fc4b
DG
2562/*
2563 * Command LTTNG_START_TRACE processed by the client thread.
a9ad0c8f
MD
2564 *
2565 * Called with session mutex held.
2f77fc4b
DG
2566 */
2567int cmd_start_trace(struct ltt_session *session)
2568{
698fb2ed 2569 enum lttng_error_code ret;
cde3e505 2570 unsigned long nb_chan = 0;
2f77fc4b
DG
2571 struct ltt_kernel_session *ksession;
2572 struct ltt_ust_session *usess;
ca2176bb
JG
2573 const bool session_rotated_after_last_stop =
2574 session->rotated_after_last_stop;
2f77fc4b
DG
2575
2576 assert(session);
2577
2578 /* Ease our life a bit ;) */
2579 ksession = session->kernel_session;
2580 usess = session->ust_session;
2581
8382cf6f
DG
2582 /* Is the session already started? */
2583 if (session->active) {
f73fabfd 2584 ret = LTTNG_ERR_TRACE_ALREADY_STARTED;
2f77fc4b
DG
2585 goto error;
2586 }
2587
ca2176bb
JG
2588 if (session->rotation_state == LTTNG_ROTATION_STATE_ONGOING &&
2589 !session->current_trace_chunk) {
2590 /*
2591 * A rotation was launched while the session was stopped and
2592 * it has not been completed yet. It is not possible to start
2593 * the session since starting the session here would require a
2594 * rotation from "NULL" to a new trace chunk. That rotation
2595 * would overlap with the ongoing rotation, which is not
2596 * supported.
2597 */
2598 WARN("Refusing to start session \"%s\" as a rotation launched after the last \"stop\" is still ongoing",
2599 session->name);
2600 ret = LTTNG_ERR_ROTATION_PENDING;
2601 goto error;
2602 }
2603
cde3e505
DG
2604 /*
2605 * Starting a session without channel is useless since after that it's not
2606 * possible to enable channel thus inform the client.
2607 */
2608 if (usess && usess->domain_global.channels) {
2609 nb_chan += lttng_ht_get_count(usess->domain_global.channels);
2610 }
2611 if (ksession) {
2612 nb_chan += ksession->channel_count;
2613 }
2614 if (!nb_chan) {
2615 ret = LTTNG_ERR_NO_CHANNEL;
2616 goto error;
2617 }
2618
ca2176bb
JG
2619 session->active = 1;
2620 session->rotated_after_last_stop = false;
c3ceb5e4 2621 if (session->output_traces && !session->current_trace_chunk) {
ca2176bb
JG
2622 if (!session->has_been_started) {
2623 struct lttng_trace_chunk *trace_chunk;
2624
2625 DBG("Creating initial trace chunk of session \"%s\"",
2626 session->name);
2627 trace_chunk = session_create_new_trace_chunk(
2628 session, NULL, NULL, NULL);
2629 if (!trace_chunk) {
2630 ret = LTTNG_ERR_CREATE_DIR_FAIL;
2631 goto error;
2632 }
2633 assert(!session->current_trace_chunk);
2634 ret = session_set_trace_chunk(session, trace_chunk,
2635 NULL);
2636 lttng_trace_chunk_put(trace_chunk);
2637 if (ret) {
2638 ret = LTTNG_ERR_CREATE_TRACE_CHUNK_FAIL_CONSUMER;
2639 goto error;
2640 }
2641 } else {
2642 DBG("Rotating session \"%s\" from its current \"NULL\" trace chunk to a new chunk",
2643 session->name);
2644 /*
2645 * Rotate existing streams into the new chunk.
2646 * This is a "quiet" rotation has no client has
2647 * explicitly requested this operation.
2648 *
2649 * There is also no need to wait for the rotation
2650 * to complete as it will happen immediately. No data
2651 * was produced as the session was stopped, so the
2652 * rotation should happen on reception of the command.
2653 */
2654 ret = cmd_rotate_session(session, NULL, true);
2655 if (ret != LTTNG_OK) {
2656 goto error;
2657 }
5c408ad8 2658 }
c996624c
JD
2659 }
2660
2f77fc4b
DG
2661 /* Kernel tracing */
2662 if (ksession != NULL) {
c996624c 2663 DBG("Start kernel tracing session %s", session->name);
32e10baa 2664 ret = start_kernel_session(ksession);
9b6c7ec5 2665 if (ret != LTTNG_OK) {
2f77fc4b
DG
2666 goto error;
2667 }
2f77fc4b
DG
2668 }
2669
2670 /* Flag session that trace should start automatically */
2671 if (usess) {
698fb2ed
JG
2672 int int_ret = ust_app_start_trace_all(usess);
2673
2674 if (int_ret < 0) {
f73fabfd 2675 ret = LTTNG_ERR_UST_START_FAIL;
2f77fc4b
DG
2676 goto error;
2677 }
2678 }
2679
5c408ad8
JD
2680 /*
2681 * Clear the flag that indicates that a rotation was done while the
2682 * session was stopped.
2683 */
2684 session->rotated_after_last_stop = false;
2685
259c2674 2686 if (session->rotate_timer_period) {
698fb2ed
JG
2687 int int_ret = timer_session_rotation_schedule_timer_start(
2688 session, session->rotate_timer_period);
2689
2690 if (int_ret < 0) {
259c2674
JD
2691 ERR("Failed to enable rotate timer");
2692 ret = LTTNG_ERR_UNK;
2693 goto error;
2694 }
2695 }
2696
f73fabfd 2697 ret = LTTNG_OK;
2f77fc4b
DG
2698
2699error:
ca2176bb
JG
2700 if (ret == LTTNG_OK) {
2701 /* Flag this after a successful start. */
2702 session->has_been_started |= 1;
2703 } else {
2704 session->active = 0;
2705 /* Restore initial state on error. */
2706 session->rotated_after_last_stop =
2707 session_rotated_after_last_stop;
2708 }
2f77fc4b
DG
2709 return ret;
2710}
2711
2712/*
2713 * Command LTTNG_STOP_TRACE processed by the client thread.
2714 */
2715int cmd_stop_trace(struct ltt_session *session)
2716{
2717 int ret;
2718 struct ltt_kernel_channel *kchan;
2719 struct ltt_kernel_session *ksession;
2720 struct ltt_ust_session *usess;
e6a80fab 2721 bool error_occurred = false;
2f77fc4b
DG
2722
2723 assert(session);
2724
5c408ad8 2725 DBG("Begin stop session %s (id %" PRIu64 ")", session->name, session->id);
2f77fc4b
DG
2726 /* Short cut */
2727 ksession = session->kernel_session;
2728 usess = session->ust_session;
2729
8382cf6f
DG
2730 /* Session is not active. Skip everythong and inform the client. */
2731 if (!session->active) {
f73fabfd 2732 ret = LTTNG_ERR_TRACE_ALREADY_STOPPED;
2f77fc4b
DG
2733 goto error;
2734 }
2735
2f77fc4b 2736 /* Kernel tracer */
14fb1ebe 2737 if (ksession && ksession->active) {
2f77fc4b
DG
2738 DBG("Stop kernel tracing");
2739
566d8970
MD
2740 ret = kernel_stop_session(ksession);
2741 if (ret < 0) {
2742 ret = LTTNG_ERR_KERN_STOP_FAIL;
2743 goto error;
2744 }
2745
32e10baa 2746 kernel_wait_quiescent();
566d8970
MD
2747
2748 /* Flush metadata after stopping (if exists) */
2f77fc4b
DG
2749 if (ksession->metadata_stream_fd >= 0) {
2750 ret = kernel_metadata_flush_buffer(ksession->metadata_stream_fd);
2751 if (ret < 0) {
2752 ERR("Kernel metadata flush failed");
653fcfe6 2753 error_occurred = true;
2f77fc4b
DG
2754 }
2755 }
2756
566d8970 2757 /* Flush all buffers after stopping */
2f77fc4b
DG
2758 cds_list_for_each_entry(kchan, &ksession->channel_list.head, list) {
2759 ret = kernel_flush_buffer(kchan);
2760 if (ret < 0) {
2761 ERR("Kernel flush buffer error");
653fcfe6 2762 error_occurred = true;
2f77fc4b
DG
2763 }
2764 }
2765
14fb1ebe 2766 ksession->active = 0;
5c408ad8
JD
2767 DBG("Kernel session stopped %s (id %" PRIu64 ")", session->name,
2768 session->id);
2f77fc4b
DG
2769 }
2770
14fb1ebe 2771 if (usess && usess->active) {
2f77fc4b
DG
2772 ret = ust_app_stop_trace_all(usess);
2773 if (ret < 0) {
f73fabfd 2774 ret = LTTNG_ERR_UST_STOP_FAIL;
2f77fc4b
DG
2775 goto error;
2776 }
2777 }
2778
8382cf6f
DG
2779 /* Flag inactive after a successful stop. */
2780 session->active = 0;
e6a80fab 2781 ret = !error_occurred ? LTTNG_OK : LTTNG_ERR_UNK;
2f77fc4b
DG
2782
2783error:
2784 return ret;
2785}
2786
2787/*
c7f618b8
JR
2788 * Set the base_path of the session only if subdir of a control uris is set.
2789 * Return LTTNG_OK on success, otherwise LTTNG_ERR_*.
2f77fc4b 2790 */
c7f618b8
JR
2791static int set_session_base_path_from_uris(struct ltt_session *session,
2792 size_t nb_uri,
bda32d56 2793 struct lttng_uri *uris)
2f77fc4b 2794{
c7f618b8
JR
2795 int ret;
2796 size_t i;
2f77fc4b 2797
f678a0fb
JR
2798 for (i = 0; i < nb_uri; i++) {
2799 if (uris[i].stype != LTTNG_STREAM_CONTROL ||
2800 uris[i].subdir[0] == '\0') {
2801 /* Not interested in these URIs */
2802 continue;
2803 }
2804
2805 if (session->base_path != NULL) {
2806 free(session->base_path);
2807 session->base_path = NULL;
2808 }
2809
2810 /* Set session base_path */
2811 session->base_path = strdup(uris[i].subdir);
2812 if (!session->base_path) {
c7f618b8
JR
2813 PERROR("Failed to copy base path \"%s\" to session \"%s\"",
2814 uris[i].subdir, session->name);
2815 ret = LTTNG_ERR_NOMEM;
f678a0fb
JR
2816 goto error;
2817 }
c7f618b8
JR
2818 DBG2("Setting base path \"%s\" for session \"%s\"",
2819 session->base_path, session->name);
2820 }
2821 ret = LTTNG_OK;
2822error:
2823 return ret;
2824}
2825
2826/*
2827 * Command LTTNG_SET_CONSUMER_URI processed by the client thread.
2828 */
2829int cmd_set_consumer_uri(struct ltt_session *session, size_t nb_uri,
2830 struct lttng_uri *uris)
2831{
2832 int ret, i;
2833 struct ltt_kernel_session *ksess = session->kernel_session;
2834 struct ltt_ust_session *usess = session->ust_session;
2835
2836 assert(session);
2837 assert(uris);
2838 assert(nb_uri > 0);
2839
2840 /* Can't set consumer URI if the session is active. */
2841 if (session->active) {
2842 ret = LTTNG_ERR_TRACE_ALREADY_STARTED;
2843 goto error;
2844 }
2845
2846 /*
2847 * Set the session base path if any. This is done inside
2848 * cmd_set_consumer_uri to preserve backward compatibility of the
2849 * previous session creation api vs the session descriptor api.
2850 */
2851 ret = set_session_base_path_from_uris(session, nb_uri, uris);
2852 if (ret != LTTNG_OK) {
2853 goto error;
f678a0fb
JR
2854 }
2855
bda32d56 2856 /* Set the "global" consumer URIs */
2f77fc4b 2857 for (i = 0; i < nb_uri; i++) {
f678a0fb
JR
2858 ret = add_uri_to_consumer(session, session->consumer, &uris[i],
2859 LTTNG_DOMAIN_NONE);
a74934ba 2860 if (ret != LTTNG_OK) {
2f77fc4b
DG
2861 goto error;
2862 }
2f77fc4b
DG
2863 }
2864
bda32d56
JG
2865 /* Set UST session URIs */
2866 if (session->ust_session) {
2867 for (i = 0; i < nb_uri; i++) {
5feee503 2868 ret = add_uri_to_consumer(session,
bda32d56 2869 session->ust_session->consumer,
5feee503 2870 &uris[i], LTTNG_DOMAIN_UST);
bda32d56
JG
2871 if (ret != LTTNG_OK) {
2872 goto error;
2873 }
2874 }
2875 }
2876
2877 /* Set kernel session URIs */
2878 if (session->kernel_session) {
2879 for (i = 0; i < nb_uri; i++) {
5feee503 2880 ret = add_uri_to_consumer(session,
bda32d56 2881 session->kernel_session->consumer,
5feee503 2882 &uris[i], LTTNG_DOMAIN_KERNEL);
bda32d56
JG
2883 if (ret != LTTNG_OK) {
2884 goto error;
2885 }
2886 }
2887 }
2888
7ab70fe0
DG
2889 /*
2890 * Make sure to set the session in output mode after we set URI since a
2891 * session can be created without URL (thus flagged in no output mode).
2892 */
2893 session->output_traces = 1;
2894 if (ksess) {
2895 ksess->output_traces = 1;
bda32d56
JG
2896 }
2897
2898 if (usess) {
7ab70fe0
DG
2899 usess->output_traces = 1;
2900 }
2901
2f77fc4b 2902 /* All good! */
f73fabfd 2903 ret = LTTNG_OK;
2f77fc4b
DG
2904
2905error:
2906 return ret;
2907}
2908
5feee503
JG
2909static
2910enum lttng_error_code set_session_output_from_descriptor(
2911 struct ltt_session *session,
2912 const struct lttng_session_descriptor *descriptor)
2f77fc4b
DG
2913{
2914 int ret;
5feee503
JG
2915 enum lttng_error_code ret_code = LTTNG_OK;
2916 enum lttng_session_descriptor_type session_type =
2917 lttng_session_descriptor_get_type(descriptor);
2918 enum lttng_session_descriptor_output_type output_type =
2919 lttng_session_descriptor_get_output_type(descriptor);
2920 struct lttng_uri uris[2] = {};
2921 size_t uri_count = 0;
2922
2923 switch (output_type) {
2924 case LTTNG_SESSION_DESCRIPTOR_OUTPUT_TYPE_NONE:
2925 goto end;
2926 case LTTNG_SESSION_DESCRIPTOR_OUTPUT_TYPE_LOCAL:
2927 lttng_session_descriptor_get_local_output_uri(descriptor,
2928 &uris[0]);
2929 uri_count = 1;
2930 break;
2931 case LTTNG_SESSION_DESCRIPTOR_OUTPUT_TYPE_NETWORK:
2932 lttng_session_descriptor_get_network_output_uris(descriptor,
2933 &uris[0], &uris[1]);
2934 uri_count = 2;
2935 break;
2936 default:
2937 ret_code = LTTNG_ERR_INVALID;
48a86f68 2938 goto end;
2f77fc4b
DG
2939 }
2940
5feee503
JG
2941 switch (session_type) {
2942 case LTTNG_SESSION_DESCRIPTOR_TYPE_SNAPSHOT:
2943 {
2944 struct snapshot_output *new_output = NULL;
2945
2946 new_output = snapshot_output_alloc();
2947 if (!new_output) {
2948 ret_code = LTTNG_ERR_NOMEM;
2949 goto end;
2950 }
2951
2952 ret = snapshot_output_init_with_uri(session,
2953 DEFAULT_SNAPSHOT_MAX_SIZE,
2954 NULL, uris, uri_count, session->consumer,
2955 new_output, &session->snapshot);
2956 if (ret < 0) {
2957 ret_code = (ret == -ENOMEM) ?
2958 LTTNG_ERR_NOMEM : LTTNG_ERR_INVALID;
2959 snapshot_output_destroy(new_output);
2960 goto end;
2961 }
2962 snapshot_add_output(&session->snapshot, new_output);
2963 break;
2964 }
2965 case LTTNG_SESSION_DESCRIPTOR_TYPE_REGULAR:
2966 case LTTNG_SESSION_DESCRIPTOR_TYPE_LIVE:
2967 {
2968 ret_code = cmd_set_consumer_uri(session, uri_count, uris);
2969 break;
2970 }
2971 default:
2972 ret_code = LTTNG_ERR_INVALID;
48a86f68 2973 goto end;
2f77fc4b 2974 }
5feee503
JG
2975end:
2976 return ret_code;
2977}
2978
2979static
2980enum lttng_error_code cmd_create_session_from_descriptor(
2981 struct lttng_session_descriptor *descriptor,
2982 const lttng_sock_cred *creds,
2983 const char *home_path)
2984{
2985 int ret;
2986 enum lttng_error_code ret_code;
2987 const char *session_name;
2988 struct ltt_session *new_session = NULL;
2989 enum lttng_session_descriptor_status descriptor_status;
2f77fc4b 2990
48a86f68 2991 session_lock_list();
5feee503
JG
2992 if (home_path) {
2993 if (*home_path != '/') {
2994 ERR("Home path provided by client is not absolute");
2995 ret_code = LTTNG_ERR_INVALID;
2996 goto end;
2997 }
2998 }
2f77fc4b 2999
5feee503
JG
3000 descriptor_status = lttng_session_descriptor_get_session_name(
3001 descriptor, &session_name);
3002 switch (descriptor_status) {
3003 case LTTNG_SESSION_DESCRIPTOR_STATUS_OK:
3004 break;
3005 case LTTNG_SESSION_DESCRIPTOR_STATUS_UNSET:
3006 session_name = NULL;
3007 break;
3008 default:
3009 ret_code = LTTNG_ERR_INVALID;
3010 goto end;
3011 }
f678a0fb 3012
5feee503 3013 ret_code = session_create(session_name, creds->uid, creds->gid,
f678a0fb 3014 &new_session);
5feee503 3015 if (ret_code != LTTNG_OK) {
48a86f68 3016 goto end;
2f77fc4b
DG
3017 }
3018
5feee503
JG
3019 if (!session_name) {
3020 ret = lttng_session_descriptor_set_session_name(descriptor,
3021 new_session->name);
3022 if (ret) {
3023 ret_code = LTTNG_ERR_SESSION_FAIL;
3024 goto end;
3025 }
3026 }
3027
3028 if (!lttng_session_descriptor_is_output_destination_initialized(
3029 descriptor)) {
3030 /*
3031 * Only include the session's creation time in the output
3032 * destination if the name of the session itself was
3033 * not auto-generated.
3034 */
3035 ret_code = lttng_session_descriptor_set_default_output(
3036 descriptor,
3037 session_name ? &new_session->creation_time : NULL,
3038 home_path);
3039 if (ret_code != LTTNG_OK) {
48a86f68 3040 goto end;
2bba9e53 3041 }
2bba9e53 3042 } else {
5feee503
JG
3043 new_session->has_user_specified_directory =
3044 lttng_session_descriptor_has_output_directory(
3045 descriptor);
2f77fc4b
DG
3046 }
3047
5feee503
JG
3048 switch (lttng_session_descriptor_get_type(descriptor)) {
3049 case LTTNG_SESSION_DESCRIPTOR_TYPE_SNAPSHOT:
3050 new_session->snapshot_mode = 1;
3051 break;
3052 case LTTNG_SESSION_DESCRIPTOR_TYPE_LIVE:
3053 new_session->live_timer =
3054 lttng_session_descriptor_live_get_timer_interval(
3055 descriptor);
3056 break;
3057 default:
3058 break;
3059 }
2f77fc4b 3060
5feee503
JG
3061 ret_code = set_session_output_from_descriptor(new_session, descriptor);
3062 if (ret_code != LTTNG_OK) {
3063 goto end;
3064 }
3065 new_session->consumer->enabled = 1;
3066 ret_code = LTTNG_OK;
48a86f68 3067end:
5feee503
JG
3068 /* Release reference provided by the session_create function. */
3069 session_put(new_session);
3070 if (ret_code != LTTNG_OK && new_session) {
3071 /* Release the global reference on error. */
3072 session_destroy(new_session);
48a86f68 3073 }
5feee503
JG
3074 session_unlock_list();
3075 return ret_code;
2f77fc4b
DG
3076}
3077
5feee503
JG
3078enum lttng_error_code cmd_create_session(struct command_ctx *cmd_ctx, int sock,
3079 struct lttng_session_descriptor **return_descriptor)
27babd3a
DG
3080{
3081 int ret;
5feee503
JG
3082 size_t payload_size;
3083 struct lttng_dynamic_buffer payload;
3084 struct lttng_buffer_view home_dir_view;
3085 struct lttng_buffer_view session_descriptor_view;
3086 struct lttng_session_descriptor *session_descriptor = NULL;
3087 enum lttng_error_code ret_code;
3088
3089 lttng_dynamic_buffer_init(&payload);
3090 if (cmd_ctx->lsm->u.create_session.home_dir_size >=
3091 LTTNG_PATH_MAX) {
3092 ret_code = LTTNG_ERR_INVALID;
3093 goto error;
27babd3a 3094 }
5feee503
JG
3095 if (cmd_ctx->lsm->u.create_session.session_descriptor_size >
3096 LTTNG_SESSION_DESCRIPTOR_MAX_LEN) {
3097 ret_code = LTTNG_ERR_INVALID;
3098 goto error;
27babd3a
DG
3099 }
3100
5feee503
JG
3101 payload_size = cmd_ctx->lsm->u.create_session.home_dir_size +
3102 cmd_ctx->lsm->u.create_session.session_descriptor_size;
3103 ret = lttng_dynamic_buffer_set_size(&payload, payload_size);
3104 if (ret) {
3105 ret_code = LTTNG_ERR_NOMEM;
3106 goto error;
27babd3a
DG
3107 }
3108
5feee503
JG
3109 ret = lttcomm_recv_unix_sock(sock, payload.data, payload.size);
3110 if (ret <= 0) {
3111 ERR("Reception of session descriptor failed, aborting.");
3112 ret_code = LTTNG_ERR_SESSION_FAIL;
3113 goto error;
27babd3a
DG
3114 }
3115
5feee503
JG
3116 home_dir_view = lttng_buffer_view_from_dynamic_buffer(
3117 &payload,
3118 0,
3119 cmd_ctx->lsm->u.create_session.home_dir_size);
3120 session_descriptor_view = lttng_buffer_view_from_dynamic_buffer(
3121 &payload,
3122 cmd_ctx->lsm->u.create_session.home_dir_size,
3123 cmd_ctx->lsm->u.create_session.session_descriptor_size);
27babd3a 3124
5feee503
JG
3125 ret = lttng_session_descriptor_create_from_buffer(
3126 &session_descriptor_view, &session_descriptor);
3127 if (ret < 0) {
3128 ERR("Failed to create session descriptor from payload of \"create session\" command");
3129 ret_code = LTTNG_ERR_INVALID;
3130 goto error;
3131 }
27babd3a 3132
5feee503
JG
3133 /*
3134 * Sets the descriptor's auto-generated properties (name, output) if
3135 * needed.
3136 */
3137 ret_code = cmd_create_session_from_descriptor(session_descriptor,
3138 &cmd_ctx->creds,
3139 home_dir_view.size ? home_dir_view.data : NULL);
3140 if (ret_code != LTTNG_OK) {
3141 goto error;
48a86f68 3142 }
5feee503
JG
3143
3144 ret_code = LTTNG_OK;
3145 *return_descriptor = session_descriptor;
3146 session_descriptor = NULL;
3147error:
3148 lttng_dynamic_buffer_reset(&payload);
3149 lttng_session_descriptor_destroy(session_descriptor);
3150 return ret_code;
27babd3a
DG
3151}
3152
823a1989
JG
3153static
3154void cmd_destroy_session_reply(const struct ltt_session *session,
3155 void *_reply_context)
3156{
3157 int ret;
3158 ssize_t comm_ret;
3159 const struct cmd_destroy_session_reply_context *reply_context =
3160 _reply_context;
3161 struct lttng_dynamic_buffer payload;
3162 struct lttcomm_session_destroy_command_header cmd_header;
3163 struct lttng_trace_archive_location *location = NULL;
3164 struct lttcomm_lttng_msg llm = {
3165 .cmd_type = LTTNG_DESTROY_SESSION,
57b5b1cf 3166 .ret_code = reply_context->destruction_status,
823a1989
JG
3167 .pid = UINT32_MAX,
3168 .cmd_header_size =
3169 sizeof(struct lttcomm_session_destroy_command_header),
3170 .data_size = 0,
3171 };
3172 size_t payload_size_before_location;
3173
3174 lttng_dynamic_buffer_init(&payload);
3175
3176 ret = lttng_dynamic_buffer_append(&payload, &llm, sizeof(llm));
3177 if (ret) {
3178 ERR("Failed to append session destruction message");
3179 goto error;
3180 }
3181
3182 cmd_header.rotation_state =
3183 (int32_t) (reply_context->implicit_rotation_on_destroy ?
3184 session->rotation_state :
3185 LTTNG_ROTATION_STATE_NO_ROTATION);
3186 ret = lttng_dynamic_buffer_append(&payload, &cmd_header,
3187 sizeof(cmd_header));
3188 if (ret) {
3189 ERR("Failed to append session destruction command header");
3190 goto error;
3191 }
3192
3193 if (!reply_context->implicit_rotation_on_destroy) {
3194 DBG("No implicit rotation performed during the destruction of session \"%s\", sending reply",
3195 session->name);
3196 goto send_reply;
3197 }
3198 if (session->rotation_state != LTTNG_ROTATION_STATE_COMPLETED) {
3199 DBG("Rotation state of session \"%s\" is not \"completed\", sending session destruction reply",
3200 session->name);
3201 goto send_reply;
3202 }
3203
3204 location = session_get_trace_archive_location(session);
3205 if (!location) {
3206 ERR("Failed to get the location of the trace archive produced during the destruction of session \"%s\"",
3207 session->name);
3208 goto error;
3209 }
3210
3211 payload_size_before_location = payload.size;
3212 comm_ret = lttng_trace_archive_location_serialize(location,
3213 &payload);
3214 if (comm_ret < 0) {
3215 ERR("Failed to serialize the location of the trace archive produced during the destruction of session \"%s\"",
3216 session->name);
3217 goto error;
3218 }
3219 /* Update the message to indicate the location's length. */
3220 ((struct lttcomm_lttng_msg *) payload.data)->data_size =
3221 payload.size - payload_size_before_location;
3222send_reply:
3223 comm_ret = lttcomm_send_unix_sock(reply_context->reply_sock_fd,
3224 payload.data, payload.size);
3225 if (comm_ret != (ssize_t) payload.size) {
3226 ERR("Failed to send result of the destruction of session \"%s\" to client",
3227 session->name);
3228 }
3229error:
3230 ret = close(reply_context->reply_sock_fd);
3231 if (ret) {
3232 PERROR("Failed to close client socket in deferred session destroy reply");
3233 }
3234 lttng_dynamic_buffer_reset(&payload);
3235 free(_reply_context);
3236}
3237
2f77fc4b
DG
3238/*
3239 * Command LTTNG_DESTROY_SESSION processed by the client thread.
a9ad0c8f
MD
3240 *
3241 * Called with session lock held.
2f77fc4b 3242 */
48a86f68 3243int cmd_destroy_session(struct ltt_session *session,
823a1989
JG
3244 struct notification_thread_handle *notification_thread_handle,
3245 int *sock_fd)
2f77fc4b
DG
3246{
3247 int ret;
57b5b1cf 3248 enum lttng_error_code destruction_last_error = LTTNG_OK;
823a1989
JG
3249 struct cmd_destroy_session_reply_context *reply_context = NULL;
3250
3251 if (sock_fd) {
3252 reply_context = zmalloc(sizeof(*reply_context));
3253 if (!reply_context) {
3254 ret = LTTNG_ERR_NOMEM;
3255 goto end;
3256 }
3257 reply_context->reply_sock_fd = *sock_fd;
3258 }
2f77fc4b
DG
3259
3260 /* Safety net */
3261 assert(session);
3262
823a1989
JG
3263 DBG("Begin destroy session %s (id %" PRIu64 ")", session->name,
3264 session->id);
3265 if (session->active) {
3266 DBG("Session \"%s\" is active, attempting to stop it before destroying it",
3267 session->name);
3268 ret = cmd_stop_trace(session);
3269 if (ret != LTTNG_OK && ret != LTTNG_ERR_TRACE_ALREADY_STOPPED) {
3270 /* Carry on with the destruction of the session. */
3271 ERR("Failed to stop session \"%s\" as part of its destruction: %s",
3272 session->name, lttng_strerror(-ret));
57b5b1cf 3273 destruction_last_error = ret;
823a1989
JG
3274 }
3275 }
5c408ad8 3276
82528808
JG
3277 if (session->rotation_schedule_timer_enabled) {
3278 if (timer_session_rotation_schedule_timer_stop(
3279 session)) {
3280 ERR("Failed to stop the \"rotation schedule\" timer of session %s",
3281 session->name);
57b5b1cf 3282 destruction_last_error = LTTNG_ERR_TIMER_STOP_ERROR;
82528808 3283 }
259c2674
JD
3284 }
3285
90936dcf
JD
3286 if (session->rotate_size) {
3287 unsubscribe_session_consumed_size_rotation(session, notification_thread_handle);
3288 session->rotate_size = 0;
3289 }
3290
e5148e25
JG
3291 if (session->most_recent_chunk_id.is_set &&
3292 session->most_recent_chunk_id.value != 0 &&
2259be0a
JG
3293 session->current_trace_chunk && session->output_traces) {
3294 /*
3295 * Perform a last rotation on destruction if rotations have
3296 * occurred during the session's lifetime.
3297 */
636a3779 3298 ret = cmd_rotate_session(session, NULL, false);
e5148e25
JG
3299 if (ret != LTTNG_OK) {
3300 ERR("Failed to perform an implicit rotation as part of the destruction of session \"%s\": %s",
3301 session->name, lttng_strerror(-ret));
57b5b1cf 3302 destruction_last_error = -ret;
f859080e 3303 }
823a1989
JG
3304 if (reply_context) {
3305 reply_context->implicit_rotation_on_destroy = true;
3306 }
c3ceb5e4 3307 } else if (session->has_been_started && session->current_trace_chunk) {
636a3779
JG
3308 /*
3309 * The user has not triggered a session rotation. However, to
3310 * ensure all data has been consumed, the session is rotated
3311 * to a 'null' trace chunk before it is destroyed.
3312 *
3313 * This is a "quiet" rotation meaning that no notification is
3314 * emitted and no renaming of the current trace chunk takes
3315 * place.
3316 */
3317 ret = cmd_rotate_session(session, NULL, true);
3318 if (ret != LTTNG_OK) {
3319 ERR("Failed to perform a quiet rotation as part of the destruction of session \"%s\": %s",
3320 session->name, lttng_strerror(-ret));
57b5b1cf 3321 destruction_last_error = -ret;
636a3779
JG
3322 }
3323 }
5c408ad8 3324
a503e1ef
JG
3325 if (session->shm_path[0]) {
3326 /*
3327 * When a session is created with an explicit shm_path,
3328 * the consumer daemon will create its shared memory files
3329 * at that location and will *not* unlink them. This is normal
3330 * as the intention of that feature is to make it possible
3331 * to retrieve the content of those files should a crash occur.
3332 *
3333 * To ensure the content of those files can be used, the
3334 * sessiond daemon will replicate the content of the metadata
3335 * cache in a metadata file.
3336 *
3337 * On clean-up, it is expected that the consumer daemon will
3338 * unlink the shared memory files and that the session daemon
3339 * will unlink the metadata file. Then, the session's directory
3340 * in the shm path can be removed.
3341 *
3342 * Unfortunately, a flaw in the design of the sessiond's and
3343 * consumerd's tear down of channels makes it impossible to
3344 * determine when the sessiond _and_ the consumerd have both
3345 * destroyed their representation of a channel. For one, the
3346 * unlinking, close, and rmdir happen in deferred 'call_rcu'
3347 * callbacks in both daemons.
3348 *
3349 * However, it is also impossible for the sessiond to know when
3350 * the consumer daemon is done destroying its channel(s) since
3351 * it occurs as a reaction to the closing of the channel's file
3352 * descriptor. There is no resulting communication initiated
3353 * from the consumerd to the sessiond to confirm that the
3354 * operation is completed (and was successful).
3355 *
3356 * Until this is all fixed, the session daemon checks for the
3357 * removal of the session's shm path which makes it possible
3358 * to safely advertise a session as having been destroyed.
3359 *
3360 * Prior to this fix, it was not possible to reliably save
3361 * a session making use of the --shm-path option, destroy it,
3362 * and load it again. This is because the creation of the
3363 * session would fail upon seeing the session's shm path
3364 * already in existence.
3365 *
3366 * Note that none of the error paths in the check for the
3367 * directory's existence return an error. This is normal
3368 * as there isn't much that can be done. The session will
3369 * be destroyed properly, except that we can't offer the
3370 * guarantee that the same session can be re-created.
3371 */
3372 current_completion_handler = &destroy_completion_handler.handler;
3373 ret = lttng_strncpy(destroy_completion_handler.shm_path,
3374 session->shm_path,
3375 sizeof(destroy_completion_handler.shm_path));
3376 assert(!ret);
3377 }
48a86f68
JG
3378
3379 /*
3380 * The session is destroyed. However, note that the command context
3381 * still holds a reference to the session, thus delaying its destruction
3382 * _at least_ up to the point when that reference is released.
3383 */
3384 session_destroy(session);
823a1989 3385 if (reply_context) {
57b5b1cf 3386 reply_context->destruction_status = destruction_last_error;
823a1989
JG
3387 ret = session_add_destroy_notifier(session,
3388 cmd_destroy_session_reply,
3389 (void *) reply_context);
3390 if (ret) {
3391 ret = LTTNG_ERR_FATAL;
3392 goto end;
3393 } else {
3394 *sock_fd = -1;
3395 }
3396 }
3397 ret = LTTNG_OK;
3398end:
2f77fc4b
DG
3399 return ret;
3400}
3401
2f77fc4b
DG
3402/*
3403 * Command LTTNG_REGISTER_CONSUMER processed by the client thread.
3404 */
56a37563
JG
3405int cmd_register_consumer(struct ltt_session *session,
3406 enum lttng_domain_type domain, const char *sock_path,
3407 struct consumer_data *cdata)
2f77fc4b
DG
3408{
3409 int ret, sock;
dd81b457 3410 struct consumer_socket *socket = NULL;
2f77fc4b
DG
3411
3412 assert(session);
3413 assert(cdata);
3414 assert(sock_path);
3415
3416 switch (domain) {
3417 case LTTNG_DOMAIN_KERNEL:
3418 {
3419 struct ltt_kernel_session *ksess = session->kernel_session;
3420
3421 assert(ksess);
3422
3423 /* Can't register a consumer if there is already one */
3424 if (ksess->consumer_fds_sent != 0) {
f73fabfd 3425 ret = LTTNG_ERR_KERN_CONSUMER_FAIL;
2f77fc4b
DG
3426 goto error;
3427 }
3428
3429 sock = lttcomm_connect_unix_sock(sock_path);
3430 if (sock < 0) {
f73fabfd 3431 ret = LTTNG_ERR_CONNECT_FAIL;
2f77fc4b
DG
3432 goto error;
3433 }
4ce514c4 3434 cdata->cmd_sock = sock;
2f77fc4b 3435
4ce514c4 3436 socket = consumer_allocate_socket(&cdata->cmd_sock);
2f77fc4b 3437 if (socket == NULL) {
f66c074c
DG
3438 ret = close(sock);
3439 if (ret < 0) {
3440 PERROR("close register consumer");
3441 }
4ce514c4 3442 cdata->cmd_sock = -1;
f73fabfd 3443 ret = LTTNG_ERR_FATAL;
2f77fc4b
DG
3444 goto error;
3445 }
3446
3447 socket->lock = zmalloc(sizeof(pthread_mutex_t));
3448 if (socket->lock == NULL) {
3449 PERROR("zmalloc pthread mutex");
f73fabfd 3450 ret = LTTNG_ERR_FATAL;
2f77fc4b
DG
3451 goto error;
3452 }
3453 pthread_mutex_init(socket->lock, NULL);
3454 socket->registered = 1;
3455
3456 rcu_read_lock();
3457 consumer_add_socket(socket, ksess->consumer);
3458 rcu_read_unlock();
3459
3460 pthread_mutex_lock(&cdata->pid_mutex);
3461 cdata->pid = -1;
3462 pthread_mutex_unlock(&cdata->pid_mutex);
3463
3464 break;
3465 }
3466 default:
3467 /* TODO: Userspace tracing */
f73fabfd 3468 ret = LTTNG_ERR_UND;
2f77fc4b
DG
3469 goto error;
3470 }
3471
dd81b457 3472 return LTTNG_OK;
2f77fc4b
DG
3473
3474error:
dd81b457
DG
3475 if (socket) {
3476 consumer_destroy_socket(socket);
3477 }
2f77fc4b
DG
3478 return ret;
3479}
3480
3481/*
3482 * Command LTTNG_LIST_DOMAINS processed by the client thread.
3483 */
3484ssize_t cmd_list_domains(struct ltt_session *session,
3485 struct lttng_domain **domains)
3486{
3487 int ret, index = 0;
3488 ssize_t nb_dom = 0;
fefd409b
DG
3489 struct agent *agt;
3490 struct lttng_ht_iter iter;
2f77fc4b
DG
3491
3492 if (session->kernel_session != NULL) {
3493 DBG3("Listing domains found kernel domain");
3494 nb_dom++;
3495 }
3496
3497 if (session->ust_session != NULL) {
3498 DBG3("Listing domains found UST global domain");
3499 nb_dom++;
3c6a091f 3500
e0a74f01 3501 rcu_read_lock();
fefd409b
DG
3502 cds_lfht_for_each_entry(session->ust_session->agents->ht, &iter.iter,
3503 agt, node.node) {
3504 if (agt->being_used) {
3505 nb_dom++;
3506 }
3c6a091f 3507 }
e0a74f01 3508 rcu_read_unlock();
2f77fc4b
DG
3509 }
3510
fa64dfb4
JG
3511 if (!nb_dom) {
3512 goto end;
3513 }
3514
2f77fc4b
DG
3515 *domains = zmalloc(nb_dom * sizeof(struct lttng_domain));
3516 if (*domains == NULL) {
f73fabfd 3517 ret = LTTNG_ERR_FATAL;
2f77fc4b
DG
3518 goto error;
3519 }
3520
3521 if (session->kernel_session != NULL) {
3522 (*domains)[index].type = LTTNG_DOMAIN_KERNEL;
b5edb9e8
PP
3523
3524 /* Kernel session buffer type is always GLOBAL */
3525 (*domains)[index].buf_type = LTTNG_BUFFER_GLOBAL;
3526
2f77fc4b
DG
3527 index++;
3528 }
3529
3530 if (session->ust_session != NULL) {
3531 (*domains)[index].type = LTTNG_DOMAIN_UST;
88c5f0d8 3532 (*domains)[index].buf_type = session->ust_session->buffer_type;
2f77fc4b 3533 index++;
3c6a091f 3534
e0a74f01 3535 rcu_read_lock();
fefd409b
DG
3536 cds_lfht_for_each_entry(session->ust_session->agents->ht, &iter.iter,
3537 agt, node.node) {
3538 if (agt->being_used) {
3539 (*domains)[index].type = agt->domain;
3540 (*domains)[index].buf_type = session->ust_session->buffer_type;
3541 index++;
3542 }
3c6a091f 3543 }
e0a74f01 3544 rcu_read_unlock();
2f77fc4b 3545 }
fa64dfb4 3546end:
2f77fc4b
DG
3547 return nb_dom;
3548
3549error:
f73fabfd
DG
3550 /* Return negative value to differentiate return code */
3551 return -ret;
2f77fc4b
DG
3552}
3553
3554
3555/*
3556 * Command LTTNG_LIST_CHANNELS processed by the client thread.
3557 */
56a37563
JG
3558ssize_t cmd_list_channels(enum lttng_domain_type domain,
3559 struct ltt_session *session, struct lttng_channel **channels)
2f77fc4b 3560{
53e367f9 3561 ssize_t nb_chan = 0, payload_size = 0, ret;
2f77fc4b
DG
3562
3563 switch (domain) {
3564 case LTTNG_DOMAIN_KERNEL:
3565 if (session->kernel_session != NULL) {
3566 nb_chan = session->kernel_session->channel_count;
3567 }
3568 DBG3("Number of kernel channels %zd", nb_chan);
c7d620a2 3569 if (nb_chan <= 0) {
53e367f9
JG
3570 ret = -LTTNG_ERR_KERN_CHAN_NOT_FOUND;
3571 goto end;
c7d620a2 3572 }
2f77fc4b
DG
3573 break;
3574 case LTTNG_DOMAIN_UST:
3575 if (session->ust_session != NULL) {
7ffc31a2 3576 rcu_read_lock();
2f77fc4b 3577 nb_chan = lttng_ht_get_count(
7ffc31a2
JG
3578 session->ust_session->domain_global.channels);
3579 rcu_read_unlock();
2f77fc4b
DG
3580 }
3581 DBG3("Number of UST global channels %zd", nb_chan);
ade7ce52 3582 if (nb_chan < 0) {
53e367f9
JG
3583 ret = -LTTNG_ERR_UST_CHAN_NOT_FOUND;
3584 goto end;
c7d620a2 3585 }
2f77fc4b
DG
3586 break;
3587 default:
53e367f9
JG
3588 ret = -LTTNG_ERR_UND;
3589 goto end;
2f77fc4b
DG
3590 }
3591
3592 if (nb_chan > 0) {
53e367f9 3593 const size_t channel_size = sizeof(struct lttng_channel) +
cf0bcb51
JG
3594 sizeof(struct lttng_channel_extended);
3595 struct lttng_channel_extended *channel_exts;
53e367f9
JG
3596
3597 payload_size = nb_chan * channel_size;
3598 *channels = zmalloc(payload_size);
2f77fc4b 3599 if (*channels == NULL) {
53e367f9
JG
3600 ret = -LTTNG_ERR_FATAL;
3601 goto end;
2f77fc4b
DG
3602 }
3603
53e367f9
JG
3604 channel_exts = ((void *) *channels) +
3605 (nb_chan * sizeof(struct lttng_channel));
d449df4a
MD
3606 ret = list_lttng_channels(domain, session, *channels, channel_exts);
3607 if (ret != LTTNG_OK) {
3608 free(*channels);
3609 *channels = NULL;
3610 goto end;
3611 }
53e367f9
JG
3612 } else {
3613 *channels = NULL;
2f77fc4b
DG
3614 }
3615
53e367f9
JG
3616 ret = payload_size;
3617end:
3618 return ret;
2f77fc4b
DG
3619}
3620
3621/*
3622 * Command LTTNG_LIST_EVENTS processed by the client thread.
3623 */
56a37563
JG
3624ssize_t cmd_list_events(enum lttng_domain_type domain,
3625 struct ltt_session *session, char *channel_name,
b4e3ceb9 3626 struct lttng_event **events, size_t *total_size)
2f77fc4b
DG
3627{
3628 int ret = 0;
3629 ssize_t nb_event = 0;
3630
3631 switch (domain) {
3632 case LTTNG_DOMAIN_KERNEL:
3633 if (session->kernel_session != NULL) {
3634 nb_event = list_lttng_kernel_events(channel_name,
b4e3ceb9
PP
3635 session->kernel_session, events,
3636 total_size);
2f77fc4b
DG
3637 }
3638 break;
3639 case LTTNG_DOMAIN_UST:
3640 {
3641 if (session->ust_session != NULL) {
3642 nb_event = list_lttng_ust_global_events(channel_name,
b4e3ceb9
PP
3643 &session->ust_session->domain_global, events,
3644 total_size);
2f77fc4b
DG
3645 }
3646 break;
3647 }
5cdb6027 3648 case LTTNG_DOMAIN_LOG4J:
3c6a091f 3649 case LTTNG_DOMAIN_JUL:
0e115563 3650 case LTTNG_DOMAIN_PYTHON:
3c6a091f 3651 if (session->ust_session) {
fefd409b
DG
3652 struct lttng_ht_iter iter;
3653 struct agent *agt;
3654
b11feea5 3655 rcu_read_lock();
fefd409b
DG
3656 cds_lfht_for_each_entry(session->ust_session->agents->ht,
3657 &iter.iter, agt, node.node) {
1dfd9906
JG
3658 if (agt->domain == domain) {
3659 nb_event = list_lttng_agent_events(
b4e3ceb9
PP
3660 agt, events,
3661 total_size);
1dfd9906
JG
3662 break;
3663 }
fefd409b 3664 }
b11feea5 3665 rcu_read_unlock();
3c6a091f
DG
3666 }
3667 break;
2f77fc4b 3668 default:
f73fabfd 3669 ret = LTTNG_ERR_UND;
2f77fc4b
DG
3670 goto error;
3671 }
3672
f73fabfd 3673 return nb_event;
2f77fc4b
DG
3674
3675error:
f73fabfd
DG
3676 /* Return negative value to differentiate return code */
3677 return -ret;
2f77fc4b
DG
3678}
3679
3680/*
3681 * Using the session list, filled a lttng_session array to send back to the
3682 * client for session listing.
3683 *
3684 * The session list lock MUST be acquired before calling this function. Use
3685 * session_lock_list() and session_unlock_list().
3686 */
5feee503
JG
3687void cmd_list_lttng_sessions(struct lttng_session *sessions,
3688 size_t session_count, uid_t uid, gid_t gid)
2f77fc4b
DG
3689{
3690 int ret;
3691 unsigned int i = 0;
3692 struct ltt_session *session;
3693 struct ltt_session_list *list = session_get_list();
5feee503
JG
3694 struct lttng_session_extended *extended =
3695 (typeof(extended)) (&sessions[session_count]);
2f77fc4b
DG
3696
3697 DBG("Getting all available session for UID %d GID %d",
3698 uid, gid);
3699 /*
3700 * Iterate over session list and append data after the control struct in
3701 * the buffer.
3702 */
3703 cds_list_for_each_entry(session, &list->head, list) {
48a86f68
JG
3704 if (!session_get(session)) {
3705 continue;
3706 }
2f77fc4b
DG
3707 /*
3708 * Only list the sessions the user can control.
3709 */
48a86f68
JG
3710 if (!session_access_ok(session, uid, gid) ||
3711 session->destroyed) {
3712 session_put(session);
2f77fc4b
DG
3713 continue;
3714 }
3715
3716 struct ltt_kernel_session *ksess = session->kernel_session;
3717 struct ltt_ust_session *usess = session->ust_session;
3718
3719 if (session->consumer->type == CONSUMER_DST_NET ||
3720 (ksess && ksess->consumer->type == CONSUMER_DST_NET) ||
3721 (usess && usess->consumer->type == CONSUMER_DST_NET)) {
3722 ret = build_network_session_path(sessions[i].path,
dec56f6c 3723 sizeof(sessions[i].path), session);
2f77fc4b 3724 } else {
dec56f6c 3725 ret = snprintf(sessions[i].path, sizeof(sessions[i].path), "%s",
366a9222 3726 session->consumer->dst.session_root_path);
2f77fc4b
DG
3727 }
3728 if (ret < 0) {
3729 PERROR("snprintf session path");
48a86f68 3730 session_put(session);
2f77fc4b
DG
3731 continue;
3732 }
3733
3734 strncpy(sessions[i].name, session->name, NAME_MAX);
3735 sessions[i].name[NAME_MAX - 1] = '\0';
8382cf6f 3736 sessions[i].enabled = session->active;
2cbf8fed 3737 sessions[i].snapshot_mode = session->snapshot_mode;
8960e9cd 3738 sessions[i].live_timer_interval = session->live_timer;
5feee503
JG
3739 extended[i].creation_time.value = (uint64_t) session->creation_time;
3740 extended[i].creation_time.is_set = 1;
2f77fc4b 3741 i++;
48a86f68 3742 session_put(session);
2f77fc4b
DG
3743 }
3744}
3745
806e2684 3746/*
6d805429 3747 * Command LTTNG_DATA_PENDING returning 0 if the data is NOT pending meaning
d3f14b8a 3748 * ready for trace analysis (or any kind of reader) or else 1 for pending data.
806e2684 3749 */
6d805429 3750int cmd_data_pending(struct ltt_session *session)
806e2684
DG
3751{
3752 int ret;
3753 struct ltt_kernel_session *ksess = session->kernel_session;
3754 struct ltt_ust_session *usess = session->ust_session;
3755
3756 assert(session);
3757
5c408ad8
JD
3758 DBG("Data pending for session %s", session->name);
3759
806e2684 3760 /* Session MUST be stopped to ask for data availability. */
8382cf6f 3761 if (session->active) {
806e2684
DG
3762 ret = LTTNG_ERR_SESSION_STARTED;
3763 goto error;
3a89d11a
DG
3764 } else {
3765 /*
3766 * If stopped, just make sure we've started before else the above call
3767 * will always send that there is data pending.
3768 *
3769 * The consumer assumes that when the data pending command is received,
3770 * the trace has been started before or else no output data is written
3771 * by the streams which is a condition for data pending. So, this is
3772 * *VERY* important that we don't ask the consumer before a start
3773 * trace.
3774 */
8382cf6f 3775 if (!session->has_been_started) {
3a89d11a
DG
3776 ret = 0;
3777 goto error;
3778 }
806e2684
DG
3779 }
3780
82528808
JG
3781 /* A rotation is still pending, we have to wait. */
3782 if (session->rotation_state == LTTNG_ROTATION_STATE_ONGOING) {
5c408ad8
JD
3783 DBG("Rotate still pending for session %s", session->name);
3784 ret = 1;
3785 goto error;
3786 }
3787
806e2684 3788 if (ksess && ksess->consumer) {
6d805429
DG
3789 ret = consumer_is_data_pending(ksess->id, ksess->consumer);
3790 if (ret == 1) {
806e2684
DG
3791 /* Data is still being extracted for the kernel. */
3792 goto error;
3793 }
3794 }
3795
3796 if (usess && usess->consumer) {
6d805429
DG
3797 ret = consumer_is_data_pending(usess->id, usess->consumer);
3798 if (ret == 1) {
806e2684
DG
3799 /* Data is still being extracted for the kernel. */
3800 goto error;
3801 }
3802 }
3803
3804 /* Data is ready to be read by a viewer */
6d805429 3805 ret = 0;
806e2684
DG
3806
3807error:
3808 return ret;
3809}
3810
6dc3064a
DG
3811/*
3812 * Command LTTNG_SNAPSHOT_ADD_OUTPUT from the lttng ctl library.
3813 *
3814 * Return LTTNG_OK on success or else a LTTNG_ERR code.
3815 */
3816int cmd_snapshot_add_output(struct ltt_session *session,
6938db9c 3817 const struct lttng_snapshot_output *output, uint32_t *id)
6dc3064a
DG
3818{
3819 int ret;
3820 struct snapshot_output *new_output;
3821
3822 assert(session);
3823 assert(output);
3824
3825 DBG("Cmd snapshot add output for session %s", session->name);
3826
3827 /*
903ef685 3828 * Can't create an output if the session is not set in no-output mode.
6dc3064a
DG
3829 */
3830 if (session->output_traces) {
903ef685 3831 ret = LTTNG_ERR_NOT_SNAPSHOT_SESSION;
6dc3064a
DG
3832 goto error;
3833 }
3834
8954c04a
JG
3835 if (session->has_non_mmap_channel) {
3836 ret = LTTNG_ERR_SNAPSHOT_UNSUPPORTED;
3837 goto error;
3838 }
3839
6dc3064a
DG
3840 /* Only one output is allowed until we have the "tee" feature. */
3841 if (session->snapshot.nb_output == 1) {
3842 ret = LTTNG_ERR_SNAPSHOT_OUTPUT_EXIST;
3843 goto error;
3844 }
3845
3846 new_output = snapshot_output_alloc();
3847 if (!new_output) {
3848 ret = LTTNG_ERR_NOMEM;
3849 goto error;
3850 }
3851
5feee503 3852 ret = snapshot_output_init(session, output->max_size, output->name,
6dc3064a
DG
3853 output->ctrl_url, output->data_url, session->consumer, new_output,
3854 &session->snapshot);
3855 if (ret < 0) {
3856 if (ret == -ENOMEM) {
3857 ret = LTTNG_ERR_NOMEM;
3858 } else {
3859 ret = LTTNG_ERR_INVALID;
3860 }
3861 goto free_error;
3862 }
3863
6dc3064a
DG
3864 rcu_read_lock();
3865 snapshot_add_output(&session->snapshot, new_output);
3866 if (id) {
3867 *id = new_output->id;
3868 }
3869 rcu_read_unlock();
3870
3871 return LTTNG_OK;
3872
3873free_error:
3874 snapshot_output_destroy(new_output);
3875error:
3876 return ret;
3877}
3878
3879/*
3880 * Command LTTNG_SNAPSHOT_DEL_OUTPUT from lib lttng ctl.
3881 *
3882 * Return LTTNG_OK on success or else a LTTNG_ERR code.
3883 */
3884int cmd_snapshot_del_output(struct ltt_session *session,
6938db9c 3885 const struct lttng_snapshot_output *output)
6dc3064a
DG
3886{
3887 int ret;
eb240553 3888 struct snapshot_output *sout = NULL;
6dc3064a
DG
3889
3890 assert(session);
3891 assert(output);
3892
6dc3064a
DG
3893 rcu_read_lock();
3894
3895 /*
d3f14b8a
MD
3896 * Permission denied to create an output if the session is not
3897 * set in no output mode.
6dc3064a
DG
3898 */
3899 if (session->output_traces) {
903ef685 3900 ret = LTTNG_ERR_NOT_SNAPSHOT_SESSION;
6dc3064a
DG
3901 goto error;
3902 }
3903
eb240553
DG
3904 if (output->id) {
3905 DBG("Cmd snapshot del output id %" PRIu32 " for session %s", output->id,
3906 session->name);
3907 sout = snapshot_find_output_by_id(output->id, &session->snapshot);
3908 } else if (*output->name != '\0') {
3909 DBG("Cmd snapshot del output name %s for session %s", output->name,
3910 session->name);
3911 sout = snapshot_find_output_by_name(output->name, &session->snapshot);
3912 }
6dc3064a
DG
3913 if (!sout) {
3914 ret = LTTNG_ERR_INVALID;
3915 goto error;
3916 }
3917
3918 snapshot_delete_output(&session->snapshot, sout);
3919 snapshot_output_destroy(sout);
3920 ret = LTTNG_OK;
3921
3922error:
3923 rcu_read_unlock();
3924 return ret;
3925}
3926
3927/*
3928 * Command LTTNG_SNAPSHOT_LIST_OUTPUT from lib lttng ctl.
3929 *
3930 * If no output is available, outputs is untouched and 0 is returned.
3931 *
3932 * Return the size of the newly allocated outputs or a negative LTTNG_ERR code.
3933 */
3934ssize_t cmd_snapshot_list_outputs(struct ltt_session *session,
3935 struct lttng_snapshot_output **outputs)
3936{
3937 int ret, idx = 0;
b223ca94 3938 struct lttng_snapshot_output *list = NULL;
6dc3064a
DG
3939 struct lttng_ht_iter iter;
3940 struct snapshot_output *output;
3941
3942 assert(session);
3943 assert(outputs);
3944
3945 DBG("Cmd snapshot list outputs for session %s", session->name);
3946
3947 /*
d3f14b8a
MD
3948 * Permission denied to create an output if the session is not
3949 * set in no output mode.
6dc3064a
DG
3950 */
3951 if (session->output_traces) {
903ef685
JG
3952 ret = -LTTNG_ERR_NOT_SNAPSHOT_SESSION;
3953 goto end;
6dc3064a
DG
3954 }
3955
3956 if (session->snapshot.nb_output == 0) {
3957 ret = 0;
903ef685 3958 goto end;
6dc3064a
DG
3959 }
3960
3961 list = zmalloc(session->snapshot.nb_output * sizeof(*list));
3962 if (!list) {
b223ca94 3963 ret = -LTTNG_ERR_NOMEM;
903ef685 3964 goto end;
6dc3064a
DG
3965 }
3966
3967 /* Copy list from session to the new list object. */
b223ca94 3968 rcu_read_lock();
6dc3064a
DG
3969 cds_lfht_for_each_entry(session->snapshot.output_ht->ht, &iter.iter,
3970 output, node.node) {
3971 assert(output->consumer);
3972 list[idx].id = output->id;
3973 list[idx].max_size = output->max_size;
6ce22875
MD
3974 if (lttng_strncpy(list[idx].name, output->name,
3975 sizeof(list[idx].name))) {
3976 ret = -LTTNG_ERR_INVALID;
903ef685 3977 goto error;
6ce22875 3978 }
6dc3064a 3979 if (output->consumer->type == CONSUMER_DST_LOCAL) {
6ce22875 3980 if (lttng_strncpy(list[idx].ctrl_url,
366a9222 3981 output->consumer->dst.session_root_path,
6ce22875
MD
3982 sizeof(list[idx].ctrl_url))) {
3983 ret = -LTTNG_ERR_INVALID;
903ef685 3984 goto error;
6ce22875 3985 }
6dc3064a
DG
3986 } else {
3987 /* Control URI. */
3988 ret = uri_to_str_url(&output->consumer->dst.net.control,
3989 list[idx].ctrl_url, sizeof(list[idx].ctrl_url));
3990 if (ret < 0) {
b223ca94 3991 ret = -LTTNG_ERR_NOMEM;
903ef685 3992 goto error;
6dc3064a
DG
3993 }
3994
3995 /* Data URI. */
3996 ret = uri_to_str_url(&output->consumer->dst.net.data,
3997 list[idx].data_url, sizeof(list[idx].data_url));
3998 if (ret < 0) {
b223ca94 3999 ret = -LTTNG_ERR_NOMEM;
903ef685 4000 goto error;
6dc3064a
DG
4001 }
4002 }
4003 idx++;
4004 }
4005
4006 *outputs = list;
b223ca94
JG
4007 list = NULL;
4008 ret = session->snapshot.nb_output;
6dc3064a 4009error:
903ef685 4010 rcu_read_unlock();
b223ca94 4011 free(list);
903ef685 4012end:
b223ca94 4013 return ret;
6dc3064a
DG
4014}
4015
93ec662e
JD
4016/*
4017 * Check if we can regenerate the metadata for this session.
4018 * Only kernel, UST per-uid and non-live sessions are supported.
4019 *
4020 * Return 0 if the metadata can be generated, a LTTNG_ERR code otherwise.
4021 */
4022static
eded6438 4023int check_regenerate_metadata_support(struct ltt_session *session)
93ec662e
JD
4024{
4025 int ret;
4026
4027 assert(session);
4028
4029 if (session->live_timer != 0) {
4030 ret = LTTNG_ERR_LIVE_SESSION;
4031 goto end;
4032 }
4033 if (!session->active) {
4034 ret = LTTNG_ERR_SESSION_NOT_STARTED;
4035 goto end;
4036 }
4037 if (session->ust_session) {
4038 switch (session->ust_session->buffer_type) {
4039 case LTTNG_BUFFER_PER_UID:
4040 break;
4041 case LTTNG_BUFFER_PER_PID:
4042 ret = LTTNG_ERR_PER_PID_SESSION;
4043 goto end;
4044 default:
4045 assert(0);
4046 ret = LTTNG_ERR_UNK;
4047 goto end;
4048 }
4049 }
4050 if (session->consumer->type == CONSUMER_DST_NET &&
4051 session->consumer->relay_minor_version < 8) {
4052 ret = LTTNG_ERR_RELAYD_VERSION_FAIL;
4053 goto end;
4054 }
4055 ret = 0;
4056
4057end:
4058 return ret;
4059}
4060
7802bae3
LL
4061static
4062int clear_metadata_file(int fd)
4063{
4064 int ret;
a5df8828 4065 off_t lseek_ret;
7802bae3 4066
a5df8828
GL
4067 lseek_ret = lseek(fd, 0, SEEK_SET);
4068 if (lseek_ret < 0) {
7802bae3 4069 PERROR("lseek");
a5df8828 4070 ret = -1;
7802bae3
LL
4071 goto end;
4072 }
4073
4074 ret = ftruncate(fd, 0);
4075 if (ret < 0) {
4076 PERROR("ftruncate");
4077 goto end;
4078 }
4079
4080end:
4081 return ret;
4082}
4083
93ec662e 4084static
eded6438 4085int ust_regenerate_metadata(struct ltt_ust_session *usess)
93ec662e
JD
4086{
4087 int ret = 0;
4088 struct buffer_reg_uid *uid_reg = NULL;
4089 struct buffer_reg_session *session_reg = NULL;
4090
4091 rcu_read_lock();
4092 cds_list_for_each_entry(uid_reg, &usess->buffer_reg_uid_list, lnode) {
4093 struct ust_registry_session *registry;
4094 struct ust_registry_channel *chan;
4095 struct lttng_ht_iter iter_chan;
4096
4097 session_reg = uid_reg->registry;
4098 registry = session_reg->reg.ust;
4099
4100 pthread_mutex_lock(&registry->lock);
4101 registry->metadata_len_sent = 0;
4102 memset(registry->metadata, 0, registry->metadata_alloc_len);
4103 registry->metadata_len = 0;
4104 registry->metadata_version++;
7802bae3
LL
4105 if (registry->metadata_fd > 0) {
4106 /* Clear the metadata file's content. */
4107 ret = clear_metadata_file(registry->metadata_fd);
4108 if (ret) {
4109 pthread_mutex_unlock(&registry->lock);
4110 goto end;
4111 }
4112 }
4113
93ec662e
JD
4114 ret = ust_metadata_session_statedump(registry, NULL,
4115 registry->major, registry->minor);
4116 if (ret) {
4117 pthread_mutex_unlock(&registry->lock);
4118 ERR("Failed to generate session metadata (err = %d)",
4119 ret);
4120 goto end;
4121 }
4122 cds_lfht_for_each_entry(registry->channels->ht, &iter_chan.iter,
4123 chan, node.node) {
4124 struct ust_registry_event *event;
4125 struct lttng_ht_iter iter_event;
4126
4127 ret = ust_metadata_channel_statedump(registry, chan);
4128 if (ret) {
4129 pthread_mutex_unlock(&registry->lock);
4130 ERR("Failed to generate channel metadata "
4131 "(err = %d)", ret);
4132 goto end;
4133 }
4134 cds_lfht_for_each_entry(chan->ht->ht, &iter_event.iter,
4135 event, node.node) {
4136 ret = ust_metadata_event_statedump(registry,
4137 chan, event);
4138 if (ret) {
4139 pthread_mutex_unlock(&registry->lock);
4140 ERR("Failed to generate event metadata "
4141 "(err = %d)", ret);
4142 goto end;
4143 }
4144 }
4145 }
4146 pthread_mutex_unlock(&registry->lock);
4147 }
4148
4149end:
4150 rcu_read_unlock();
4151 return ret;
4152}
4153
4154/*
eded6438 4155 * Command LTTNG_REGENERATE_METADATA from the lttng-ctl library.
93ec662e
JD
4156 *
4157 * Ask the consumer to truncate the existing metadata file(s) and
4158 * then regenerate the metadata. Live and per-pid sessions are not
4159 * supported and return an error.
4160 *
4161 * Return 0 on success or else a LTTNG_ERR code.
4162 */
eded6438 4163int cmd_regenerate_metadata(struct ltt_session *session)
93ec662e
JD
4164{
4165 int ret;
4166
4167 assert(session);
4168
eded6438 4169 ret = check_regenerate_metadata_support(session);
93ec662e
JD
4170 if (ret) {
4171 goto end;
4172 }
4173
4174 if (session->kernel_session) {
eded6438 4175 ret = kernctl_session_regenerate_metadata(
93ec662e
JD
4176 session->kernel_session->fd);
4177 if (ret < 0) {
4178 ERR("Failed to regenerate the kernel metadata");
4179 goto end;
4180 }
4181 }
4182
4183 if (session->ust_session) {
eded6438 4184 ret = ust_regenerate_metadata(session->ust_session);
93ec662e
JD
4185 if (ret < 0) {
4186 ERR("Failed to regenerate the UST metadata");
4187 goto end;
4188 }
4189 }
4190 DBG("Cmd metadata regenerate for session %s", session->name);
4191 ret = LTTNG_OK;
4192
4193end:
4194 return ret;
4195}
4196
c2561365
JD
4197/*
4198 * Command LTTNG_REGENERATE_STATEDUMP from the lttng-ctl library.
4199 *
4200 * Ask the tracer to regenerate a new statedump.
4201 *
4202 * Return 0 on success or else a LTTNG_ERR code.
4203 */
4204int cmd_regenerate_statedump(struct ltt_session *session)
4205{
4206 int ret;
4207
4208 assert(session);
4209
4210 if (!session->active) {
4211 ret = LTTNG_ERR_SESSION_NOT_STARTED;
4212 goto end;
4213 }
c2561365
JD
4214
4215 if (session->kernel_session) {
4216 ret = kernctl_session_regenerate_statedump(
4217 session->kernel_session->fd);
4218 /*
4219 * Currently, the statedump in kernel can only fail if out
4220 * of memory.
4221 */
4222 if (ret < 0) {
4223 if (ret == -ENOMEM) {
4224 ret = LTTNG_ERR_REGEN_STATEDUMP_NOMEM;
4225 } else {
4226 ret = LTTNG_ERR_REGEN_STATEDUMP_FAIL;
4227 }
4228 ERR("Failed to regenerate the kernel statedump");
4229 goto end;
4230 }
4231 }
4232
4233 if (session->ust_session) {
4234 ret = ust_app_regenerate_statedump_all(session->ust_session);
4235 /*
4236 * Currently, the statedump in UST always returns 0.
4237 */
4238 if (ret < 0) {
4239 ret = LTTNG_ERR_REGEN_STATEDUMP_FAIL;
4240 ERR("Failed to regenerate the UST statedump");
4241 goto end;
4242 }
4243 }
4244 DBG("Cmd regenerate statedump for session %s", session->name);
4245 ret = LTTNG_OK;
4246
4247end:
4248 return ret;
4249}
4250
b0880ae5
JG
4251int cmd_register_trigger(struct command_ctx *cmd_ctx, int sock,
4252 struct notification_thread_handle *notification_thread)
4253{
4254 int ret;
4255 size_t trigger_len;
4256 ssize_t sock_recv_len;
4257 struct lttng_trigger *trigger = NULL;
4258 struct lttng_buffer_view view;
4259 struct lttng_dynamic_buffer trigger_buffer;
4260
4261 lttng_dynamic_buffer_init(&trigger_buffer);
4262 trigger_len = (size_t) cmd_ctx->lsm->u.trigger.length;
4263 ret = lttng_dynamic_buffer_set_size(&trigger_buffer, trigger_len);
4264 if (ret) {
4265 ret = LTTNG_ERR_NOMEM;
4266 goto end;
4267 }
4268
4269 sock_recv_len = lttcomm_recv_unix_sock(sock, trigger_buffer.data,
4270 trigger_len);
4271 if (sock_recv_len < 0 || sock_recv_len != trigger_len) {
4272 ERR("Failed to receive \"register trigger\" command payload");
4273 /* TODO: should this be a new error enum ? */
4274 ret = LTTNG_ERR_INVALID_TRIGGER;
4275 goto end;
4276 }
4277
4278 view = lttng_buffer_view_from_dynamic_buffer(&trigger_buffer, 0, -1);
4279 if (lttng_trigger_create_from_buffer(&view, &trigger) !=
4280 trigger_len) {
4281 ERR("Invalid trigger payload received in \"register trigger\" command");
4282 ret = LTTNG_ERR_INVALID_TRIGGER;
4283 goto end;
4284 }
4285
4286 ret = notification_thread_command_register_trigger(notification_thread,
4287 trigger);
587f9fd0
JG
4288 /* Ownership of trigger was transferred. */
4289 trigger = NULL;
b0880ae5 4290end:
587f9fd0 4291 lttng_trigger_destroy(trigger);
b0880ae5
JG
4292 lttng_dynamic_buffer_reset(&trigger_buffer);
4293 return ret;
4294}
4295
4296int cmd_unregister_trigger(struct command_ctx *cmd_ctx, int sock,
4297 struct notification_thread_handle *notification_thread)
4298{
4299 int ret;
4300 size_t trigger_len;
4301 ssize_t sock_recv_len;
4302 struct lttng_trigger *trigger = NULL;
4303 struct lttng_buffer_view view;
4304 struct lttng_dynamic_buffer trigger_buffer;
4305
4306 lttng_dynamic_buffer_init(&trigger_buffer);
4307 trigger_len = (size_t) cmd_ctx->lsm->u.trigger.length;
4308 ret = lttng_dynamic_buffer_set_size(&trigger_buffer, trigger_len);
4309 if (ret) {
4310 ret = LTTNG_ERR_NOMEM;
4311 goto end;
4312 }
4313
4314 sock_recv_len = lttcomm_recv_unix_sock(sock, trigger_buffer.data,
4315 trigger_len);
4316 if (sock_recv_len < 0 || sock_recv_len != trigger_len) {
4317 ERR("Failed to receive \"unregister trigger\" command payload");
4318 /* TODO: should this be a new error enum ? */
4319 ret = LTTNG_ERR_INVALID_TRIGGER;
4320 goto end;
4321 }
4322
4323 view = lttng_buffer_view_from_dynamic_buffer(&trigger_buffer, 0, -1);
4324 if (lttng_trigger_create_from_buffer(&view, &trigger) !=
4325 trigger_len) {
4326 ERR("Invalid trigger payload received in \"unregister trigger\" command");
4327 ret = LTTNG_ERR_INVALID_TRIGGER;
4328 goto end;
4329 }
4330
4331 ret = notification_thread_command_unregister_trigger(notification_thread,
4332 trigger);
4333end:
587f9fd0 4334 lttng_trigger_destroy(trigger);
b0880ae5
JG
4335 lttng_dynamic_buffer_reset(&trigger_buffer);
4336 return ret;
4337}
4338
6dc3064a
DG
4339/*
4340 * Send relayd sockets from snapshot output to consumer. Ignore request if the
4341 * snapshot output is *not* set with a remote destination.
4342 *
8f07cd01 4343 * Return LTTNG_OK on success or a LTTNG_ERR code.
6dc3064a 4344 */
8f07cd01 4345static enum lttng_error_code set_relayd_for_snapshot(
61ace1d3 4346 struct consumer_output *output,
65ff8ea3 4347 const struct ltt_session *session)
6dc3064a 4348{
8f07cd01 4349 enum lttng_error_code status = LTTNG_OK;
6dc3064a
DG
4350 struct lttng_ht_iter iter;
4351 struct consumer_socket *socket;
b2c25d00 4352 LTTNG_OPTIONAL(uint64_t) current_chunk_id = {};
6ef36453 4353 const char *base_path;
6dc3064a 4354
61ace1d3 4355 assert(output);
6dc3064a
DG
4356 assert(session);
4357
4358 DBG2("Set relayd object from snapshot output");
4359
b2c25d00 4360 if (session->current_trace_chunk) {
61ace1d3
JG
4361 enum lttng_trace_chunk_status chunk_status =
4362 lttng_trace_chunk_get_id(
4363 session->current_trace_chunk,
4364 &current_chunk_id.value);
b2c25d00 4365
61ace1d3 4366 if (chunk_status == LTTNG_TRACE_CHUNK_STATUS_OK) {
b2c25d00
JG
4367 current_chunk_id.is_set = true;
4368 } else {
4369 ERR("Failed to get current trace chunk id");
4370 status = LTTNG_ERR_UNK;
4371 goto error;
4372 }
4373 }
4374
6dc3064a 4375 /* Ignore if snapshot consumer output is not network. */
61ace1d3 4376 if (output->type != CONSUMER_DST_NET) {
6dc3064a
DG
4377 goto error;
4378 }
4379
6ef36453
MD
4380 /*
4381 * The snapshot record URI base path overrides the session
4382 * base path.
4383 */
4384 if (output->dst.net.control.subdir[0] != '\0') {
4385 base_path = output->dst.net.control.subdir;
4386 } else {
4387 base_path = session->base_path;
4388 }
4389
6dc3064a
DG
4390 /*
4391 * For each consumer socket, create and send the relayd object of the
4392 * snapshot output.
4393 */
4394 rcu_read_lock();
61ace1d3 4395 cds_lfht_for_each_entry(output->socks->ht, &iter.iter,
5eecee74 4396 socket, node.node) {
ecd0f96d 4397 pthread_mutex_lock(socket->lock);
8f07cd01 4398 status = send_consumer_relayd_sockets(0, session->id,
61ace1d3 4399 output, socket,
d3e2ba59 4400 session->name, session->hostname,
6ef36453 4401 base_path,
b2c25d00 4402 session->live_timer,
0fb564b1 4403 current_chunk_id.is_set ? &current_chunk_id.value : NULL,
55ce50b6
MD
4404 session->creation_time,
4405 session->name_contains_creation_time);
ecd0f96d 4406 pthread_mutex_unlock(socket->lock);
8f07cd01 4407 if (status != LTTNG_OK) {
6dc3064a
DG
4408 rcu_read_unlock();
4409 goto error;
4410 }
4411 }
4412 rcu_read_unlock();
4413
4414error:
8f07cd01 4415 return status;
6dc3064a
DG
4416}
4417
4418/*
4419 * Record a kernel snapshot.
4420 *
fac41e72 4421 * Return LTTNG_OK on success or a LTTNG_ERR code.
6dc3064a 4422 */
65ff8ea3
JG
4423static enum lttng_error_code record_kernel_snapshot(
4424 struct ltt_kernel_session *ksess,
61ace1d3 4425 const struct consumer_output *output,
65ff8ea3 4426 const struct ltt_session *session,
d07ceecd 4427 int wait, uint64_t nb_packets_per_stream)
6dc3064a 4428{
8f07cd01 4429 enum lttng_error_code status;
6dc3064a
DG
4430
4431 assert(ksess);
4432 assert(output);
4433 assert(session);
4434
61ace1d3
JG
4435 status = kernel_snapshot_record(
4436 ksess, output, wait, nb_packets_per_stream);
8f07cd01 4437 return status;
6dc3064a
DG
4438}
4439
4440/*
4441 * Record a UST snapshot.
4442 *
8f07cd01 4443 * Returns LTTNG_OK on success or a LTTNG_ERR error code.
6dc3064a 4444 */
8f07cd01 4445static enum lttng_error_code record_ust_snapshot(struct ltt_ust_session *usess,
61ace1d3
JG
4446 const struct consumer_output *output,
4447 const struct ltt_session *session,
4448 int wait, uint64_t nb_packets_per_stream)
6dc3064a 4449{
8f07cd01 4450 enum lttng_error_code status;
6dc3064a
DG
4451
4452 assert(usess);
4453 assert(output);
4454 assert(session);
4455
61ace1d3
JG
4456 status = ust_app_snapshot_record(
4457 usess, output, wait, nb_packets_per_stream);
8f07cd01 4458 return status;
6dc3064a
DG
4459}
4460
d07ceecd 4461static
65ff8ea3
JG
4462uint64_t get_session_size_one_more_packet_per_stream(
4463 const struct ltt_session *session, uint64_t cur_nr_packets)
68808f4e 4464{
d07ceecd 4465 uint64_t tot_size = 0;
68808f4e
DG
4466
4467 if (session->kernel_session) {
4468 struct ltt_kernel_channel *chan;
65ff8ea3
JG
4469 const struct ltt_kernel_session *ksess =
4470 session->kernel_session;
68808f4e 4471
68808f4e 4472 cds_list_for_each_entry(chan, &ksess->channel_list.head, list) {
d07ceecd
MD
4473 if (cur_nr_packets >= chan->channel->attr.num_subbuf) {
4474 /*
4475 * Don't take channel into account if we
4476 * already grab all its packets.
4477 */
4478 continue;
68808f4e 4479 }
d07ceecd
MD
4480 tot_size += chan->channel->attr.subbuf_size
4481 * chan->stream_count;
68808f4e
DG
4482 }
4483 }
4484
4485 if (session->ust_session) {
65ff8ea3 4486 const struct ltt_ust_session *usess = session->ust_session;
68808f4e 4487
d07ceecd
MD
4488 tot_size += ust_app_get_size_one_more_packet_per_stream(usess,
4489 cur_nr_packets);
68808f4e
DG
4490 }
4491
d07ceecd 4492 return tot_size;
68808f4e
DG
4493}
4494
5c786ded 4495/*
d07ceecd
MD
4496 * Calculate the number of packets we can grab from each stream that
4497 * fits within the overall snapshot max size.
4498 *
4499 * Returns -1 on error, 0 means infinite number of packets, else > 0 is
4500 * the number of packets per stream.
4501 *
4502 * TODO: this approach is not perfect: we consider the worse case
4503 * (packet filling the sub-buffers) as an upper bound, but we could do
4504 * better if we do this calculation while we actually grab the packet
4505 * content: we would know how much padding we don't actually store into
4506 * the file.
4507 *
4508 * This algorithm is currently bounded by the number of packets per
4509 * stream.
4510 *
4511 * Since we call this algorithm before actually grabbing the data, it's
4512 * an approximation: for instance, applications could appear/disappear
4513 * in between this call and actually grabbing data.
5c786ded 4514 */
d07ceecd 4515static
65ff8ea3
JG
4516int64_t get_session_nb_packets_per_stream(const struct ltt_session *session,
4517 uint64_t max_size)
5c786ded 4518{
d07ceecd
MD
4519 int64_t size_left;
4520 uint64_t cur_nb_packets = 0;
5c786ded 4521
d07ceecd
MD
4522 if (!max_size) {
4523 return 0; /* Infinite */
5c786ded
JD
4524 }
4525
d07ceecd
MD
4526 size_left = max_size;
4527 for (;;) {
4528 uint64_t one_more_packet_tot_size;
5c786ded 4529
65ff8ea3
JG
4530 one_more_packet_tot_size = get_session_size_one_more_packet_per_stream(
4531 session, cur_nb_packets);
d07ceecd
MD
4532 if (!one_more_packet_tot_size) {
4533 /* We are already grabbing all packets. */
4534 break;
4535 }
4536 size_left -= one_more_packet_tot_size;
4537 if (size_left < 0) {
4538 break;
4539 }
4540 cur_nb_packets++;
5c786ded 4541 }
76a95f15 4542 if (!cur_nb_packets && size_left != max_size) {
d07ceecd
MD
4543 /* Not enough room to grab one packet of each stream, error. */
4544 return -1;
4545 }
4546 return cur_nb_packets;
5c786ded
JD
4547}
4548
65ff8ea3 4549static
e5148e25 4550enum lttng_error_code snapshot_record(struct ltt_session *session,
65ff8ea3
JG
4551 const struct snapshot_output *snapshot_output, int wait)
4552{
4553 int64_t nb_packets_per_stream;
e5148e25 4554 char snapshot_chunk_name[LTTNG_NAME_MAX];
61ace1d3
JG
4555 int ret;
4556 enum lttng_error_code ret_code = LTTNG_OK;
e5148e25 4557 struct lttng_trace_chunk *snapshot_trace_chunk;
61ace1d3
JG
4558 struct consumer_output *original_ust_consumer_output = NULL;
4559 struct consumer_output *original_kernel_consumer_output = NULL;
4560 struct consumer_output *snapshot_ust_consumer_output = NULL;
4561 struct consumer_output *snapshot_kernel_consumer_output = NULL;
e5148e25 4562
61ace1d3 4563 ret = snprintf(snapshot_chunk_name, sizeof(snapshot_chunk_name),
e5148e25
JG
4564 "%s-%s-%" PRIu64,
4565 snapshot_output->name,
4566 snapshot_output->datetime,
4567 snapshot_output->nb_snapshot);
61ace1d3 4568 if (ret < 0 || ret >= sizeof(snapshot_chunk_name)) {
e5148e25 4569 ERR("Failed to format snapshot name");
61ace1d3
JG
4570 ret_code = LTTNG_ERR_INVALID;
4571 goto error;
e5148e25
JG
4572 }
4573 DBG("Recording snapshot \"%s\" for session \"%s\" with chunk name \"%s\"",
4574 snapshot_output->name, session->name,
4575 snapshot_chunk_name);
61ace1d3
JG
4576 if (!session->kernel_session && !session->ust_session) {
4577 ERR("Failed to record snapshot as no channels exist");
4578 ret_code = LTTNG_ERR_NO_CHANNEL;
4579 goto error;
4580 }
4581
4582 if (session->kernel_session) {
4583 original_kernel_consumer_output =
4584 session->kernel_session->consumer;
4585 snapshot_kernel_consumer_output =
4586 consumer_copy_output(snapshot_output->consumer);
1819b04a
MD
4587 strcpy(snapshot_kernel_consumer_output->chunk_path,
4588 snapshot_chunk_name);
61ace1d3
JG
4589 ret = consumer_copy_sockets(snapshot_kernel_consumer_output,
4590 original_kernel_consumer_output);
4591 if (ret < 0) {
4592 ERR("Failed to copy consumer sockets from snapshot output configuration");
4593 ret_code = LTTNG_ERR_NOMEM;
4594 goto error;
4595 }
4596 ret_code = set_relayd_for_snapshot(
4597 snapshot_kernel_consumer_output, session);
4598 if (ret_code != LTTNG_OK) {
4599 ERR("Failed to setup relay daemon for kernel tracer snapshot");
4600 goto error;
4601 }
4602 session->kernel_session->consumer =
4603 snapshot_kernel_consumer_output;
4604 }
4605 if (session->ust_session) {
4606 original_ust_consumer_output = session->ust_session->consumer;
4607 snapshot_ust_consumer_output =
4608 consumer_copy_output(snapshot_output->consumer);
1819b04a
MD
4609 strcpy(snapshot_ust_consumer_output->chunk_path,
4610 snapshot_chunk_name);
61ace1d3
JG
4611 ret = consumer_copy_sockets(snapshot_ust_consumer_output,
4612 original_ust_consumer_output);
4613 if (ret < 0) {
4614 ERR("Failed to copy consumer sockets from snapshot output configuration");
4615 ret_code = LTTNG_ERR_NOMEM;
4616 goto error;
4617 }
4618 ret_code = set_relayd_for_snapshot(
4619 snapshot_ust_consumer_output, session);
4620 if (ret_code != LTTNG_OK) {
4621 ERR("Failed to setup relay daemon for userspace tracer snapshot");
4622 goto error;
4623 }
4624 session->ust_session->consumer =
4625 snapshot_ust_consumer_output;
4626 }
4627
e5148e25 4628 snapshot_trace_chunk = session_create_new_trace_chunk(session,
61ace1d3
JG
4629 snapshot_kernel_consumer_output ?:
4630 snapshot_ust_consumer_output,
4631 consumer_output_get_base_path(
4632 snapshot_output->consumer),
e5148e25
JG
4633 snapshot_chunk_name);
4634 if (!snapshot_trace_chunk) {
61ace1d3
JG
4635 ERR("Failed to create temporary trace chunk to record a snapshot of session \"%s\"",
4636 session->name);
4637 ret_code = LTTNG_ERR_CREATE_DIR_FAIL;
4638 goto error;
e5148e25
JG
4639 }
4640 assert(!session->current_trace_chunk);
4641 ret = session_set_trace_chunk(session, snapshot_trace_chunk, NULL);
4642 lttng_trace_chunk_put(snapshot_trace_chunk);
4643 snapshot_trace_chunk = NULL;
4644 if (ret) {
61ace1d3
JG
4645 ERR("Failed to set temporary trace chunk to record a snapshot of session \"%s\"",
4646 session->name);
4647 ret_code = LTTNG_ERR_CREATE_TRACE_CHUNK_FAIL_CONSUMER;
4648 goto error;
e5148e25 4649 }
65ff8ea3
JG
4650
4651 nb_packets_per_stream = get_session_nb_packets_per_stream(session,
4652 snapshot_output->max_size);
4653 if (nb_packets_per_stream < 0) {
61ace1d3 4654 ret_code = LTTNG_ERR_MAX_SIZE_INVALID;
836c7d54 4655 goto error_close_trace_chunk;
65ff8ea3
JG
4656 }
4657
4658 if (session->kernel_session) {
61ace1d3
JG
4659 ret_code = record_kernel_snapshot(session->kernel_session,
4660 snapshot_kernel_consumer_output, session,
65ff8ea3 4661 wait, nb_packets_per_stream);
61ace1d3 4662 if (ret_code != LTTNG_OK) {
836c7d54 4663 goto error_close_trace_chunk;
65ff8ea3
JG
4664 }
4665 }
4666
4667 if (session->ust_session) {
61ace1d3
JG
4668 ret_code = record_ust_snapshot(session->ust_session,
4669 snapshot_ust_consumer_output, session,
65ff8ea3 4670 wait, nb_packets_per_stream);
61ace1d3 4671 if (ret_code != LTTNG_OK) {
836c7d54 4672 goto error_close_trace_chunk;
65ff8ea3
JG
4673 }
4674 }
836c7d54 4675error_close_trace_chunk:
6bbcff33 4676 if (session_close_trace_chunk(
41b23598 4677 session, session->current_trace_chunk, NULL, NULL)) {
e5148e25
JG
4678 /*
4679 * Don't goto end; make sure the chunk is closed for the session
4680 * to allow future snapshots.
4681 */
4682 ERR("Failed to close snapshot trace chunk of session \"%s\"",
4683 session->name);
61ace1d3 4684 ret_code = LTTNG_ERR_CLOSE_TRACE_CHUNK_FAIL_CONSUMER;
e5148e25
JG
4685 }
4686 if (session_set_trace_chunk(session, NULL, NULL)) {
4687 ERR("Failed to release the current trace chunk of session \"%s\"",
4688 session->name);
61ace1d3 4689 ret_code = LTTNG_ERR_UNK;
e5148e25 4690 }
61ace1d3
JG
4691error:
4692 if (original_ust_consumer_output) {
4693 session->ust_session->consumer = original_ust_consumer_output;
4694 }
4695 if (original_kernel_consumer_output) {
4696 session->kernel_session->consumer =
4697 original_kernel_consumer_output;
4698 }
4699 consumer_output_put(snapshot_ust_consumer_output);
4700 consumer_output_put(snapshot_kernel_consumer_output);
4701 return ret_code;
65ff8ea3
JG
4702}
4703
6dc3064a
DG
4704/*
4705 * Command LTTNG_SNAPSHOT_RECORD from lib lttng ctl.
4706 *
4707 * The wait parameter is ignored so this call always wait for the snapshot to
4708 * complete before returning.
4709 *
4710 * Return LTTNG_OK on success or else a LTTNG_ERR code.
4711 */
4712int cmd_snapshot_record(struct ltt_session *session,
6938db9c 4713 const struct lttng_snapshot_output *output, int wait)
6dc3064a 4714{
8f07cd01
JG
4715 enum lttng_error_code cmd_ret = LTTNG_OK;
4716 int ret;
00e1dfc4 4717 unsigned int snapshot_success = 0;
10ba83fe 4718 char datetime[16];
dade7378 4719 struct snapshot_output *tmp_output = NULL;
6dc3064a
DG
4720
4721 assert(session);
ba45d9f0 4722 assert(output);
6dc3064a
DG
4723
4724 DBG("Cmd snapshot record for session %s", session->name);
4725
10ba83fe
JR
4726 /* Get the datetime for the snapshot output directory. */
4727 ret = utils_get_current_time_str("%Y%m%d-%H%M%S", datetime,
4728 sizeof(datetime));
4729 if (!ret) {
8f07cd01 4730 cmd_ret = LTTNG_ERR_INVALID;
10ba83fe
JR
4731 goto error;
4732 }
4733
6dc3064a 4734 /*
d3f14b8a
MD
4735 * Permission denied to create an output if the session is not
4736 * set in no output mode.
6dc3064a
DG
4737 */
4738 if (session->output_traces) {
8f07cd01 4739 cmd_ret = LTTNG_ERR_NOT_SNAPSHOT_SESSION;
6dc3064a
DG
4740 goto error;
4741 }
4742
4743 /* The session needs to be started at least once. */
8382cf6f 4744 if (!session->has_been_started) {
8f07cd01 4745 cmd_ret = LTTNG_ERR_START_SESSION_ONCE;
6dc3064a
DG
4746 goto error;
4747 }
4748
4749 /* Use temporary output for the session. */
ba45d9f0 4750 if (*output->ctrl_url != '\0') {
dade7378
JG
4751 tmp_output = snapshot_output_alloc();
4752 if (!tmp_output) {
4753 cmd_ret = LTTNG_ERR_NOMEM;
4754 goto error;
4755 }
4756
5feee503
JG
4757 ret = snapshot_output_init(session, output->max_size,
4758 output->name,
4759 output->ctrl_url, output->data_url,
4760 session->consumer,
dade7378 4761 tmp_output, NULL);
6dc3064a
DG
4762 if (ret < 0) {
4763 if (ret == -ENOMEM) {
8f07cd01 4764 cmd_ret = LTTNG_ERR_NOMEM;
6dc3064a 4765 } else {
8f07cd01 4766 cmd_ret = LTTNG_ERR_INVALID;
6dc3064a
DG
4767 }
4768 goto error;
4769 }
1bfe7328 4770 /* Use the global session count for the temporary snapshot. */
dade7378 4771 tmp_output->nb_snapshot = session->snapshot.nb_snapshot;
10ba83fe
JR
4772
4773 /* Use the global datetime */
dade7378
JG
4774 memcpy(tmp_output->datetime, datetime, sizeof(datetime));
4775 cmd_ret = snapshot_record(session, tmp_output, wait);
65ff8ea3 4776 if (cmd_ret != LTTNG_OK) {
804c90a8
JR
4777 goto error;
4778 }
804c90a8
JR
4779 snapshot_success = 1;
4780 } else {
4781 struct snapshot_output *sout;
4782 struct lttng_ht_iter iter;
68808f4e 4783
804c90a8
JR
4784 rcu_read_lock();
4785 cds_lfht_for_each_entry(session->snapshot.output_ht->ht,
4786 &iter.iter, sout, node.node) {
dade7378
JG
4787 struct snapshot_output output_copy;
4788
804c90a8 4789 /*
dade7378
JG
4790 * Make a local copy of the output and override output
4791 * parameters with those provided as part of the
4792 * command.
804c90a8 4793 */
dade7378 4794 memcpy(&output_copy, sout, sizeof(output_copy));
1bfe7328 4795
804c90a8 4796 if (output->max_size != (uint64_t) -1ULL) {
dade7378 4797 output_copy.max_size = output->max_size;
6dc3064a 4798 }
d07ceecd 4799
dade7378
JG
4800 output_copy.nb_snapshot = session->snapshot.nb_snapshot;
4801 memcpy(output_copy.datetime, datetime,
4802 sizeof(datetime));
6dc3064a 4803
804c90a8
JR
4804 /* Use temporary name. */
4805 if (*output->name != '\0') {
dade7378
JG
4806 if (lttng_strncpy(output_copy.name,
4807 output->name,
4808 sizeof(output_copy.name))) {
8f07cd01 4809 cmd_ret = LTTNG_ERR_INVALID;
cf3e357d
MD
4810 rcu_read_unlock();
4811 goto error;
4812 }
804c90a8 4813 }
e1986656 4814
dade7378 4815 cmd_ret = snapshot_record(session, &output_copy, wait);
65ff8ea3
JG
4816 if (cmd_ret != LTTNG_OK) {
4817 rcu_read_unlock();
4818 goto error;
6dc3064a 4819 }
804c90a8 4820 snapshot_success = 1;
6dc3064a 4821 }
804c90a8 4822 rcu_read_unlock();
6dc3064a
DG
4823 }
4824
1bfe7328
DG
4825 if (snapshot_success) {
4826 session->snapshot.nb_snapshot++;
b67578cb 4827 } else {
8f07cd01 4828 cmd_ret = LTTNG_ERR_SNAPSHOT_FAIL;
1bfe7328
DG
4829 }
4830
6dc3064a 4831error:
dade7378
JG
4832 if (tmp_output) {
4833 snapshot_output_destroy(tmp_output);
4834 }
8f07cd01 4835 return cmd_ret;
6dc3064a
DG
4836}
4837
d7ba1388
MD
4838/*
4839 * Command LTTNG_SET_SESSION_SHM_PATH processed by the client thread.
4840 */
4841int cmd_set_session_shm_path(struct ltt_session *session,
4842 const char *shm_path)
4843{
4844 /* Safety net */
4845 assert(session);
4846
4847 /*
4848 * Can only set shm path before session is started.
4849 */
4850 if (session->has_been_started) {
4851 return LTTNG_ERR_SESSION_STARTED;
4852 }
4853
4854 strncpy(session->shm_path, shm_path,
4855 sizeof(session->shm_path));
4856 session->shm_path[sizeof(session->shm_path) - 1] = '\0';
4857
4858 return 0;
4859}
4860
5c408ad8
JD
4861/*
4862 * Command LTTNG_ROTATE_SESSION from the lttng-ctl library.
4863 *
4864 * Ask the consumer to rotate the session output directory.
4865 * The session lock must be held.
4866 *
01d7dcc5 4867 * Returns LTTNG_OK on success or else a negative LTTng error code.
5c408ad8
JD
4868 */
4869int cmd_rotate_session(struct ltt_session *session,
636a3779
JG
4870 struct lttng_rotate_session_return *rotate_return,
4871 bool quiet_rotation)
5c408ad8
JD
4872{
4873 int ret;
e5148e25 4874 uint64_t ongoing_rotation_chunk_id;
01d7dcc5 4875 enum lttng_error_code cmd_ret = LTTNG_OK;
e5148e25
JG
4876 struct lttng_trace_chunk *chunk_being_archived = NULL;
4877 struct lttng_trace_chunk *new_trace_chunk = NULL;
4878 enum lttng_trace_chunk_status chunk_status;
8712cbfc
JG
4879 bool failed_to_rotate = false;
4880 enum lttng_error_code rotation_fail_code = LTTNG_OK;
5c408ad8
JD
4881
4882 assert(session);
4883
4884 if (!session->has_been_started) {
01d7dcc5 4885 cmd_ret = LTTNG_ERR_START_SESSION_ONCE;
d68c9a04 4886 goto end;
5c408ad8
JD
4887 }
4888
aaed9f3e
MD
4889 /*
4890 * Explicit rotation is not supported for live sessions.
4891 * However, live sessions can perform a quiet rotation on
4892 * destroy.
4893 * Rotation is not supported for snapshot traces (no output).
4894 */
4895 if ((!quiet_rotation && session->live_timer) ||
4896 !session->output_traces) {
01d7dcc5 4897 cmd_ret = LTTNG_ERR_ROTATION_NOT_AVAILABLE;
d68c9a04 4898 goto end;
5c408ad8
JD
4899 }
4900
e5148e25 4901 /* Unsupported feature in lttng-relayd before 2.11. */
c3ceb5e4 4902 if (!quiet_rotation && session->consumer->type == CONSUMER_DST_NET &&
5c408ad8
JD
4903 (session->consumer->relay_major_version == 2 &&
4904 session->consumer->relay_minor_version < 11)) {
01d7dcc5 4905 cmd_ret = LTTNG_ERR_ROTATION_NOT_AVAILABLE_RELAY;
d68c9a04 4906 goto end;
5c408ad8
JD
4907 }
4908
c8eabe73
MD
4909 /* Unsupported feature in lttng-modules before 2.8 (lack of sequence number). */
4910 if (session->kernel_session && !kernel_supports_ring_buffer_packet_sequence_number()) {
4911 cmd_ret = LTTNG_ERR_ROTATION_NOT_AVAILABLE_KERNEL;
4912 goto end;
4913 }
4914
82528808 4915 if (session->rotation_state == LTTNG_ROTATION_STATE_ONGOING) {
82528808
JG
4916 DBG("Refusing to launch a rotation; a rotation is already in progress for session %s",
4917 session->name);
01d7dcc5 4918 cmd_ret = LTTNG_ERR_ROTATION_PENDING;
d68c9a04 4919 goto end;
5c408ad8
JD
4920 }
4921
4922 /*
4923 * After a stop, we only allow one rotation to occur, the other ones are
4924 * useless until a new start.
4925 */
4926 if (session->rotated_after_last_stop) {
4927 DBG("Session \"%s\" was already rotated after stop, refusing rotation",
4928 session->name);
01d7dcc5 4929 cmd_ret = LTTNG_ERR_ROTATION_MULTIPLE_AFTER_STOP;
d68c9a04 4930 goto end;
5c408ad8 4931 }
e5148e25 4932 if (session->active) {
61ace1d3 4933 new_trace_chunk = session_create_new_trace_chunk(session, NULL,
e5148e25
JG
4934 NULL, NULL);
4935 if (!new_trace_chunk) {
4936 cmd_ret = LTTNG_ERR_CREATE_DIR_FAIL;
4937 goto error;
5c408ad8 4938 }
e5148e25 4939 }
d70d3b5f 4940
8712cbfc
JG
4941 /*
4942 * The current trace chunk becomes the chunk being archived.
4943 *
4944 * After this point, "chunk_being_archived" must absolutely
4945 * be closed on the consumer(s), otherwise it will never be
4946 * cleaned-up, which will result in a leak.
4947 */
e5148e25
JG
4948 ret = session_set_trace_chunk(session, new_trace_chunk,
4949 &chunk_being_archived);
4950 if (ret) {
4951 cmd_ret = LTTNG_ERR_CREATE_TRACE_CHUNK_FAIL_CONSUMER;
5feee503
JG
4952 goto error;
4953 }
4954
5c408ad8 4955 if (session->kernel_session) {
01d7dcc5
JG
4956 cmd_ret = kernel_rotate_session(session);
4957 if (cmd_ret != LTTNG_OK) {
8712cbfc
JG
4958 failed_to_rotate = true;
4959 rotation_fail_code = cmd_ret;
5c408ad8
JD
4960 }
4961 }
4962 if (session->ust_session) {
01d7dcc5
JG
4963 cmd_ret = ust_app_rotate_session(session);
4964 if (cmd_ret != LTTNG_OK) {
8712cbfc
JG
4965 failed_to_rotate = true;
4966 rotation_fail_code = cmd_ret;
5c408ad8 4967 }
82528808 4968 }
17dd1232 4969
e60b9189
JG
4970 if (!session->active) {
4971 session->rotated_after_last_stop = true;
4972 }
4973
4974 if (!chunk_being_archived) {
4975 DBG("Rotating session \"%s\" from a \"NULL\" trace chunk to a new trace chunk, skipping completion check",
4976 session->name);
4977 if (failed_to_rotate) {
4978 cmd_ret = rotation_fail_code;
4979 goto error;
4980 }
4981 cmd_ret = LTTNG_OK;
4982 goto end;
4983 }
4984
4985 session->rotation_state = LTTNG_ROTATION_STATE_ONGOING;
4986 chunk_status = lttng_trace_chunk_get_id(chunk_being_archived,
4987 &ongoing_rotation_chunk_id);
4988 assert(chunk_status == LTTNG_TRACE_CHUNK_STATUS_OK);
4989
6bbcff33 4990 ret = session_close_trace_chunk(session, chunk_being_archived,
636a3779
JG
4991 quiet_rotation ?
4992 NULL :
4993 &((enum lttng_trace_chunk_command_type){
41b23598
MD
4994 LTTNG_TRACE_CHUNK_COMMAND_TYPE_MOVE_TO_COMPLETED}),
4995 session->last_chunk_path);
e5148e25
JG
4996 if (ret) {
4997 cmd_ret = LTTNG_ERR_CLOSE_TRACE_CHUNK_FAIL_CONSUMER;
4998 goto error;
4999 }
5000
8712cbfc
JG
5001 if (failed_to_rotate) {
5002 cmd_ret = rotation_fail_code;
5003 goto error;
5004 }
5005
636a3779 5006 session->quiet_rotation = quiet_rotation;
82528808
JG
5007 ret = timer_session_rotation_pending_check_start(session,
5008 DEFAULT_ROTATE_PENDING_TIMER);
5009 if (ret) {
01d7dcc5 5010 cmd_ret = LTTNG_ERR_UNK;
d70d3b5f 5011 goto error;
5c408ad8
JD
5012 }
5013
5c408ad8 5014 if (rotate_return) {
e5148e25 5015 rotate_return->rotation_id = ongoing_rotation_chunk_id;
5c408ad8
JD
5016 }
5017
e5148e25
JG
5018 session->chunk_being_archived = chunk_being_archived;
5019 chunk_being_archived = NULL;
636a3779
JG
5020 if (!quiet_rotation) {
5021 ret = notification_thread_command_session_rotation_ongoing(
5022 notification_thread_handle,
5023 session->name, session->uid, session->gid,
5024 ongoing_rotation_chunk_id);
5025 if (ret != LTTNG_OK) {
5026 ERR("Failed to notify notification thread that a session rotation is ongoing for session %s",
5027 session->name);
5028 cmd_ret = ret;
5029 }
d70d3b5f
JG
5030 }
5031
82528808 5032 DBG("Cmd rotate session %s, archive_id %" PRIu64 " sent",
e5148e25 5033 session->name, ongoing_rotation_chunk_id);
5c408ad8 5034end:
e5148e25
JG
5035 lttng_trace_chunk_put(new_trace_chunk);
5036 lttng_trace_chunk_put(chunk_being_archived);
01d7dcc5 5037 ret = (cmd_ret == LTTNG_OK) ? cmd_ret : -((int) cmd_ret);
5c408ad8 5038 return ret;
d70d3b5f 5039error:
d70d3b5f 5040 if (session_reset_rotation_state(session,
e5148e25 5041 LTTNG_ROTATION_STATE_ERROR)) {
d70d3b5f
JG
5042 ERR("Failed to reset rotation state of session \"%s\"",
5043 session->name);
5044 }
5045 goto end;
5c408ad8
JD
5046}
5047
5048/*
d68c9a04 5049 * Command LTTNG_ROTATION_GET_INFO from the lttng-ctl library.
5c408ad8
JD
5050 *
5051 * Check if the session has finished its rotation.
5052 *
e5148e25 5053 * Return LTTNG_OK on success or else an LTTNG_ERR code.
5c408ad8 5054 */
d68c9a04
JD
5055int cmd_rotate_get_info(struct ltt_session *session,
5056 struct lttng_rotation_get_info_return *info_return,
5057 uint64_t rotation_id)
5c408ad8 5058{
e5148e25
JG
5059 enum lttng_error_code cmd_ret = LTTNG_OK;
5060 enum lttng_rotation_state rotation_state;
5c408ad8 5061
d68c9a04 5062 DBG("Cmd rotate_get_info session %s, rotation id %" PRIu64, session->name,
e5148e25 5063 session->most_recent_chunk_id.value);
5c408ad8 5064
e5148e25
JG
5065 if (session->chunk_being_archived) {
5066 enum lttng_trace_chunk_status chunk_status;
5067 uint64_t chunk_id;
5068
5069 chunk_status = lttng_trace_chunk_get_id(
5070 session->chunk_being_archived,
5071 &chunk_id);
5072 assert(chunk_status == LTTNG_TRACE_CHUNK_STATUS_OK);
5073
5074 rotation_state = rotation_id == chunk_id ?
5075 LTTNG_ROTATION_STATE_ONGOING :
5076 LTTNG_ROTATION_STATE_EXPIRED;
5077 } else {
5078 if (session->last_archived_chunk_id.is_set &&
5079 rotation_id != session->last_archived_chunk_id.value) {
5080 rotation_state = LTTNG_ROTATION_STATE_EXPIRED;
5081 } else {
5082 rotation_state = session->rotation_state;
5083 }
5c408ad8
JD
5084 }
5085
e5148e25
JG
5086 switch (rotation_state) {
5087 case LTTNG_ROTATION_STATE_NO_ROTATION:
6486cfa7 5088 DBG("Reporting that no rotation has occurred within the lifetime of session \"%s\"",
e5148e25
JG
5089 session->name);
5090 goto end;
5091 case LTTNG_ROTATION_STATE_EXPIRED:
5092 DBG("Reporting that the rotation state of rotation id %" PRIu64 " of session \"%s\" has expired",
5093 rotation_id, session->name);
5094 break;
d68c9a04 5095 case LTTNG_ROTATION_STATE_ONGOING:
e5148e25 5096 DBG("Reporting that rotation id %" PRIu64 " of session \"%s\" is still pending",
d68c9a04
JD
5097 rotation_id, session->name);
5098 break;
5099 case LTTNG_ROTATION_STATE_COMPLETED:
dd73d57b 5100 {
e5148e25
JG
5101 int fmt_ret;
5102 char *chunk_path;
dd73d57b
JG
5103 char *current_tracing_path_reply;
5104 size_t current_tracing_path_reply_len;
5105
e5148e25
JG
5106 DBG("Reporting that rotation id %" PRIu64 " of session \"%s\" is completed",
5107 rotation_id, session->name);
5108
dd73d57b
JG
5109 switch (session_get_consumer_destination_type(session)) {
5110 case CONSUMER_DST_LOCAL:
5111 current_tracing_path_reply =
5112 info_return->location.local.absolute_path;
5113 current_tracing_path_reply_len =
5114 sizeof(info_return->location.local.absolute_path);
5115 info_return->location_type =
05f8afa9 5116 (int8_t) LTTNG_TRACE_ARCHIVE_LOCATION_TYPE_LOCAL;
41b23598
MD
5117 fmt_ret = asprintf(&chunk_path,
5118 "%s/" DEFAULT_ARCHIVED_TRACE_CHUNKS_DIRECTORY "/%s",
5119 session_get_base_path(session),
5120 session->last_archived_chunk_name);
5121 if (fmt_ret == -1) {
5122 PERROR("Failed to format the path of the last archived trace chunk");
5123 info_return->status = LTTNG_ROTATION_STATUS_ERROR;
5124 cmd_ret = LTTNG_ERR_UNK;
5125 goto end;
5126 }
dd73d57b
JG
5127 break;
5128 case CONSUMER_DST_NET:
4692d090
JG
5129 {
5130 uint16_t ctrl_port, data_port;
5131
dd73d57b
JG
5132 current_tracing_path_reply =
5133 info_return->location.relay.relative_path;
5134 current_tracing_path_reply_len =
5135 sizeof(info_return->location.relay.relative_path);
5136 /* Currently the only supported relay protocol. */
5137 info_return->location.relay.protocol =
05f8afa9 5138 (int8_t) LTTNG_TRACE_ARCHIVE_LOCATION_RELAY_PROTOCOL_TYPE_TCP;
dd73d57b 5139
e5148e25 5140 fmt_ret = lttng_strncpy(info_return->location.relay.host,
dd73d57b
JG
5141 session_get_net_consumer_hostname(session),
5142 sizeof(info_return->location.relay.host));
e5148e25
JG
5143 if (fmt_ret) {
5144 ERR("Failed to copy host name to rotate_get_info reply");
dd73d57b 5145 info_return->status = LTTNG_ROTATION_STATUS_ERROR;
e5148e25 5146 cmd_ret = LTTNG_ERR_SET_URL;
dd73d57b
JG
5147 goto end;
5148 }
5149
4692d090
JG
5150 session_get_net_consumer_ports(session, &ctrl_port, &data_port);
5151 info_return->location.relay.ports.control = ctrl_port;
5152 info_return->location.relay.ports.data = data_port;
dd73d57b 5153 info_return->location_type =
05f8afa9 5154 (int8_t) LTTNG_TRACE_ARCHIVE_LOCATION_TYPE_RELAY;
41b23598
MD
5155 chunk_path = strdup(session->last_chunk_path);
5156 if (!chunk_path) {
5157 ERR("Failed to allocate the path of the last archived trace chunk");
5158 info_return->status = LTTNG_ROTATION_STATUS_ERROR;
5159 cmd_ret = LTTNG_ERR_UNK;
5160 goto end;
5161 }
dd73d57b 5162 break;
4692d090 5163 }
dd73d57b
JG
5164 default:
5165 abort();
5166 }
e5148e25
JG
5167
5168 fmt_ret = lttng_strncpy(current_tracing_path_reply,
5169 chunk_path, current_tracing_path_reply_len);
5170 free(chunk_path);
5171 if (fmt_ret) {
5172 ERR("Failed to copy path of the last archived trace chunk to rotate_get_info reply");
d68c9a04 5173 info_return->status = LTTNG_ROTATION_STATUS_ERROR;
e5148e25 5174 cmd_ret = LTTNG_ERR_UNK;
5c408ad8
JD
5175 goto end;
5176 }
dd73d57b 5177
d68c9a04 5178 break;
dd73d57b 5179 }
d68c9a04 5180 case LTTNG_ROTATION_STATE_ERROR:
e5148e25 5181 DBG("Reporting that an error occurred during rotation %" PRIu64 " of session \"%s\"",
d68c9a04
JD
5182 rotation_id, session->name);
5183 break;
5184 default:
5185 abort();
5c408ad8
JD
5186 }
5187
e5148e25 5188 cmd_ret = LTTNG_OK;
5c408ad8 5189end:
e5148e25
JG
5190 info_return->status = (int32_t) rotation_state;
5191 return cmd_ret;
5c408ad8
JD
5192}
5193
259c2674
JD
5194/*
5195 * Command LTTNG_ROTATION_SET_SCHEDULE from the lttng-ctl library.
5196 *
5197 * Configure the automatic rotation parameters.
66ea93b1
JG
5198 * 'activate' to true means activate the rotation schedule type with 'new_value'.
5199 * 'activate' to false means deactivate the rotation schedule and validate that
5200 * 'new_value' has the same value as the currently active value.
259c2674 5201 *
66ea93b1 5202 * Return 0 on success or else a positive LTTNG_ERR code.
259c2674
JD
5203 */
5204int cmd_rotation_set_schedule(struct ltt_session *session,
66ea93b1
JG
5205 bool activate, enum lttng_rotation_schedule_type schedule_type,
5206 uint64_t new_value,
90936dcf 5207 struct notification_thread_handle *notification_thread_handle)
259c2674
JD
5208{
5209 int ret;
66ea93b1 5210 uint64_t *parameter_value;
259c2674
JD
5211
5212 assert(session);
5213
5214 DBG("Cmd rotate set schedule session %s", session->name);
5215
5268a79b 5216 if (session->live_timer || !session->output_traces) {
66ea93b1 5217 DBG("Failing ROTATION_SET_SCHEDULE command as the rotation feature is not available for this session");
259c2674
JD
5218 ret = LTTNG_ERR_ROTATION_NOT_AVAILABLE;
5219 goto end;
5220 }
5221
66ea93b1
JG
5222 switch (schedule_type) {
5223 case LTTNG_ROTATION_SCHEDULE_TYPE_SIZE_THRESHOLD:
5224 parameter_value = &session->rotate_size;
5225 break;
5226 case LTTNG_ROTATION_SCHEDULE_TYPE_PERIODIC:
5227 parameter_value = &session->rotate_timer_period;
5228 if (new_value >= UINT_MAX) {
5229 DBG("Failing ROTATION_SET_SCHEDULE command as the value requested for a periodic rotation schedule is invalid: %" PRIu64 " > %u (UINT_MAX)",
5230 new_value, UINT_MAX);
5231 ret = LTTNG_ERR_INVALID;
5232 goto end;
5233 }
5234 break;
5235 default:
5236 WARN("Failing ROTATION_SET_SCHEDULE command on unknown schedule type");
5237 ret = LTTNG_ERR_INVALID;
259c2674 5238 goto end;
66ea93b1
JG
5239 }
5240
5241 /* Improper use of the API. */
5242 if (new_value == -1ULL) {
5243 WARN("Failing ROTATION_SET_SCHEDULE command as the value requested is -1");
5244 ret = LTTNG_ERR_INVALID;
259c2674
JD
5245 goto end;
5246 }
5247
66ea93b1
JG
5248 /*
5249 * As indicated in struct ltt_session's comments, a value of == 0 means
5250 * this schedule rotation type is not in use.
5251 *
5252 * Reject the command if we were asked to activate a schedule that was
5253 * already active.
5254 */
5255 if (activate && *parameter_value != 0) {
5256 DBG("Failing ROTATION_SET_SCHEDULE (activate) command as the schedule is already active");
5257 ret = LTTNG_ERR_ROTATION_SCHEDULE_SET;
90936dcf 5258 goto end;
66ea93b1
JG
5259 }
5260
5261 /*
5262 * Reject the command if we were asked to deactivate a schedule that was
5263 * not active.
5264 */
5265 if (!activate && *parameter_value == 0) {
5266 DBG("Failing ROTATION_SET_SCHEDULE (deactivate) command as the schedule is already inactive");
5267 ret = LTTNG_ERR_ROTATION_SCHEDULE_NOT_SET;
90936dcf
JD
5268 goto end;
5269 }
5270
66ea93b1
JG
5271 /*
5272 * Reject the command if we were asked to deactivate a schedule that
5273 * doesn't exist.
5274 */
5275 if (!activate && *parameter_value != new_value) {
5276 DBG("Failing ROTATION_SET_SCHEDULE (deactivate) command as an inexistant schedule was provided");
5277 ret = LTTNG_ERR_ROTATION_SCHEDULE_NOT_SET;
5278 goto end;
5279 }
259c2674 5280
66ea93b1
JG
5281 *parameter_value = activate ? new_value : 0;
5282
5283 switch (schedule_type) {
5284 case LTTNG_ROTATION_SCHEDULE_TYPE_PERIODIC:
5285 if (activate && session->active) {
5286 /*
5287 * Only start the timer if the session is active,
5288 * otherwise it will be started when the session starts.
5289 */
82528808
JG
5290 ret = timer_session_rotation_schedule_timer_start(
5291 session, new_value);
259c2674 5292 if (ret) {
66ea93b1 5293 ERR("Failed to enable session rotation timer in ROTATION_SET_SCHEDULE command");
259c2674
JD
5294 ret = LTTNG_ERR_UNK;
5295 goto end;
5296 }
66ea93b1 5297 } else {
82528808
JG
5298 ret = timer_session_rotation_schedule_timer_stop(
5299 session);
66ea93b1
JG
5300 if (ret) {
5301 ERR("Failed to disable session rotation timer in ROTATION_SET_SCHEDULE command");
5302 ret = LTTNG_ERR_UNK;
f3ce6946 5303 goto end;
66ea93b1 5304 }
259c2674 5305 }
66ea93b1
JG
5306 break;
5307 case LTTNG_ROTATION_SCHEDULE_TYPE_SIZE_THRESHOLD:
5308 if (activate) {
5309 ret = subscribe_session_consumed_size_rotation(session,
5310 new_value, notification_thread_handle);
90936dcf 5311 if (ret) {
66ea93b1 5312 ERR("Failed to enable consumed-size notification in ROTATION_SET_SCHEDULE command");
90936dcf
JD
5313 ret = LTTNG_ERR_UNK;
5314 goto end;
5315 }
90936dcf 5316 } else {
66ea93b1
JG
5317 ret = unsubscribe_session_consumed_size_rotation(session,
5318 notification_thread_handle);
90936dcf 5319 if (ret) {
66ea93b1 5320 ERR("Failed to disable consumed-size notification in ROTATION_SET_SCHEDULE command");
90936dcf
JD
5321 ret = LTTNG_ERR_UNK;
5322 goto end;
5323 }
66ea93b1 5324
90936dcf 5325 }
66ea93b1
JG
5326 break;
5327 default:
5328 /* Would have been caught before. */
5329 abort();
90936dcf
JD
5330 }
5331
259c2674
JD
5332 ret = LTTNG_OK;
5333
5334 goto end;
5335
5336end:
5337 return ret;
5338}
5339
a503e1ef
JG
5340/* Wait for a given path to be removed before continuing. */
5341static enum lttng_error_code wait_on_path(void *path_data)
5342{
5343 const char *shm_path = path_data;
5344
5345 DBG("Waiting for the shm path at %s to be removed before completing session destruction",
5346 shm_path);
5347 while (true) {
5348 int ret;
5349 struct stat st;
5350
5351 ret = stat(shm_path, &st);
5352 if (ret) {
5353 if (errno != ENOENT) {
5354 PERROR("stat() returned an error while checking for the existence of the shm path");
5355 } else {
5356 DBG("shm path no longer exists, completing the destruction of session");
5357 }
5358 break;
5359 } else {
5360 if (!S_ISDIR(st.st_mode)) {
5361 ERR("The type of shm path %s returned by stat() is not a directory; aborting the wait for shm path removal",
5362 shm_path);
5363 break;
5364 }
5365 }
5366 usleep(SESSION_DESTROY_SHM_PATH_CHECK_DELAY_US);
5367 }
5368 return LTTNG_OK;
5369}
5370
5371/*
5372 * Returns a pointer to a handler to run on completion of a command.
5373 * Returns NULL if no handler has to be run for the last command executed.
5374 */
5375const struct cmd_completion_handler *cmd_pop_completion_handler(void)
5376{
5377 struct cmd_completion_handler *handler = current_completion_handler;
5378
5379 current_completion_handler = NULL;
5380 return handler;
5381}
5382
2f77fc4b
DG
5383/*
5384 * Init command subsystem.
5385 */
5386void cmd_init(void)
5387{
5388 /*
d88aee68
DG
5389 * Set network sequence index to 1 for streams to match a relayd
5390 * socket on the consumer side.
2f77fc4b 5391 */
d88aee68
DG
5392 pthread_mutex_lock(&relayd_net_seq_idx_lock);
5393 relayd_net_seq_idx = 1;
5394 pthread_mutex_unlock(&relayd_net_seq_idx_lock);
2f77fc4b
DG
5395
5396 DBG("Command subsystem initialized");
5397}
This page took 0.402014 seconds and 4 git commands to generate.