Document add-context limitation for started session
[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>
24
25#include <common/defaults.h>
26#include <common/common.h>
27#include <common/sessiond-comm/sessiond-comm.h>
28#include <common/relayd/relayd.h>
10a50311 29#include <common/utils.h>
f5436bfc 30#include <common/compat/string.h>
93ec662e 31#include <common/kernel-ctl/kernel-ctl.h>
b0880ae5
JG
32#include <common/dynamic-buffer.h>
33#include <common/buffer-view.h>
34#include <lttng/trigger/trigger-internal.h>
35#include <lttng/condition/condition.h>
36#include <lttng/action/action.h>
6e21424e 37#include <lttng/channel.h>
b0880ae5 38#include <lttng/channel-internal.h>
9f449915 39#include <common/string-utils/string-utils.h>
2f77fc4b
DG
40
41#include "channel.h"
42#include "consumer.h"
43#include "event.h"
8782cc74 44#include "health-sessiond.h"
2f77fc4b
DG
45#include "kernel.h"
46#include "kernel-consumer.h"
47#include "lttng-sessiond.h"
48#include "utils.h"
834978fd 49#include "syscall.h"
7c1d2758 50#include "agent.h"
93ec662e 51#include "buffer-registry.h"
b0880ae5
JG
52#include "notification-thread.h"
53#include "notification-thread-commands.h"
2f77fc4b
DG
54
55#include "cmd.h"
56
57/*
58 * Used to keep a unique index for each relayd socket created where this value
59 * is associated with streams on the consumer so it can match the right relayd
d88aee68
DG
60 * to send to. It must be accessed with the relayd_net_seq_idx_lock
61 * held.
2f77fc4b 62 */
d88aee68
DG
63static pthread_mutex_t relayd_net_seq_idx_lock = PTHREAD_MUTEX_INITIALIZER;
64static uint64_t relayd_net_seq_idx;
2f77fc4b 65
7076b56e
JG
66static int validate_ust_event_name(const char *);
67static int cmd_enable_event_internal(struct ltt_session *session,
68 struct lttng_domain *domain,
69 char *channel_name, struct lttng_event *event,
70 char *filter_expression,
71 struct lttng_filter_bytecode *filter,
72 struct lttng_event_exclusion *exclusion,
73 int wpipe);
74
2f77fc4b
DG
75/*
76 * Create a session path used by list_lttng_sessions for the case that the
77 * session consumer is on the network.
78 */
79static int build_network_session_path(char *dst, size_t size,
80 struct ltt_session *session)
81{
82 int ret, kdata_port, udata_port;
83 struct lttng_uri *kuri = NULL, *uuri = NULL, *uri = NULL;
84 char tmp_uurl[PATH_MAX], tmp_urls[PATH_MAX];
85
86 assert(session);
87 assert(dst);
88
89 memset(tmp_urls, 0, sizeof(tmp_urls));
90 memset(tmp_uurl, 0, sizeof(tmp_uurl));
91
92 kdata_port = udata_port = DEFAULT_NETWORK_DATA_PORT;
93
94 if (session->kernel_session && session->kernel_session->consumer) {
95 kuri = &session->kernel_session->consumer->dst.net.control;
96 kdata_port = session->kernel_session->consumer->dst.net.data.port;
97 }
98
99 if (session->ust_session && session->ust_session->consumer) {
100 uuri = &session->ust_session->consumer->dst.net.control;
101 udata_port = session->ust_session->consumer->dst.net.data.port;
102 }
103
104 if (uuri == NULL && kuri == NULL) {
105 uri = &session->consumer->dst.net.control;
106 kdata_port = session->consumer->dst.net.data.port;
107 } else if (kuri && uuri) {
108 ret = uri_compare(kuri, uuri);
109 if (ret) {
110 /* Not Equal */
111 uri = kuri;
112 /* Build uuri URL string */
113 ret = uri_to_str_url(uuri, tmp_uurl, sizeof(tmp_uurl));
114 if (ret < 0) {
115 goto error;
116 }
117 } else {
118 uri = kuri;
119 }
120 } else if (kuri && uuri == NULL) {
121 uri = kuri;
122 } else if (uuri && kuri == NULL) {
123 uri = uuri;
124 }
125
126 ret = uri_to_str_url(uri, tmp_urls, sizeof(tmp_urls));
127 if (ret < 0) {
128 goto error;
129 }
130
9aa9f900
DG
131 /*
132 * Do we have a UST url set. If yes, this means we have both kernel and UST
133 * to print.
134 */
9d035200 135 if (*tmp_uurl != '\0') {
2f77fc4b
DG
136 ret = snprintf(dst, size, "[K]: %s [data: %d] -- [U]: %s [data: %d]",
137 tmp_urls, kdata_port, tmp_uurl, udata_port);
138 } else {
9aa9f900 139 int dport;
bef08707 140 if (kuri || (!kuri && !uuri)) {
9aa9f900
DG
141 dport = kdata_port;
142 } else {
143 /* No kernel URI, use the UST port. */
144 dport = udata_port;
145 }
146 ret = snprintf(dst, size, "%s [data: %d]", tmp_urls, dport);
2f77fc4b
DG
147 }
148
149error:
150 return ret;
151}
152
fb83fe64
JD
153/*
154 * Get run-time attributes if the session has been started (discarded events,
155 * lost packets).
156 */
157static int get_kernel_runtime_stats(struct ltt_session *session,
158 struct ltt_kernel_channel *kchan, uint64_t *discarded_events,
159 uint64_t *lost_packets)
160{
161 int ret;
162
163 if (!session->has_been_started) {
164 ret = 0;
165 *discarded_events = 0;
166 *lost_packets = 0;
167 goto end;
168 }
169
170 ret = consumer_get_discarded_events(session->id, kchan->fd,
171 session->kernel_session->consumer,
172 discarded_events);
173 if (ret < 0) {
174 goto end;
175 }
176
177 ret = consumer_get_lost_packets(session->id, kchan->fd,
178 session->kernel_session->consumer,
179 lost_packets);
180 if (ret < 0) {
181 goto end;
182 }
183
184end:
185 return ret;
186}
187
188/*
189 * Get run-time attributes if the session has been started (discarded events,
190 * lost packets).
191 */
192static int get_ust_runtime_stats(struct ltt_session *session,
193 struct ltt_ust_channel *uchan, uint64_t *discarded_events,
194 uint64_t *lost_packets)
195{
196 int ret;
197 struct ltt_ust_session *usess;
198
a91c5803
JG
199 if (!discarded_events || !lost_packets) {
200 ret = -1;
201 goto end;
202 }
203
fb83fe64 204 usess = session->ust_session;
a905c624
JG
205 assert(discarded_events);
206 assert(lost_packets);
fb83fe64
JD
207
208 if (!usess || !session->has_been_started) {
209 *discarded_events = 0;
210 *lost_packets = 0;
211 ret = 0;
212 goto end;
213 }
214
215 if (usess->buffer_type == LTTNG_BUFFER_PER_UID) {
216 ret = ust_app_uid_get_channel_runtime_stats(usess->id,
217 &usess->buffer_reg_uid_list,
218 usess->consumer, uchan->id,
219 uchan->attr.overwrite,
220 discarded_events,
221 lost_packets);
222 } else if (usess->buffer_type == LTTNG_BUFFER_PER_PID) {
223 ret = ust_app_pid_get_channel_runtime_stats(usess,
224 uchan, usess->consumer,
225 uchan->attr.overwrite,
226 discarded_events,
227 lost_packets);
228 if (ret < 0) {
229 goto end;
230 }
231 *discarded_events += uchan->per_pid_closed_app_discarded;
232 *lost_packets += uchan->per_pid_closed_app_lost;
233 } else {
234 ERR("Unsupported buffer type");
967bc289 235 assert(0);
fb83fe64
JD
236 ret = -1;
237 goto end;
238 }
239
240end:
241 return ret;
242}
243
2f77fc4b
DG
244/*
245 * Fill lttng_channel array of all channels.
246 */
d449df4a 247static ssize_t list_lttng_channels(enum lttng_domain_type domain,
fb83fe64 248 struct ltt_session *session, struct lttng_channel *channels,
cf0bcb51 249 struct lttng_channel_extended *chan_exts)
2f77fc4b 250{
d449df4a 251 int i = 0, ret = 0;
2f77fc4b
DG
252 struct ltt_kernel_channel *kchan;
253
254 DBG("Listing channels for session %s", session->name);
255
256 switch (domain) {
257 case LTTNG_DOMAIN_KERNEL:
258 /* Kernel channels */
259 if (session->kernel_session != NULL) {
260 cds_list_for_each_entry(kchan,
261 &session->kernel_session->channel_list.head, list) {
fb83fe64 262 uint64_t discarded_events, lost_packets;
cf0bcb51
JG
263 struct lttng_channel_extended *extended;
264
265 extended = (struct lttng_channel_extended *)
266 kchan->channel->attr.extended.ptr;
fb83fe64
JD
267
268 ret = get_kernel_runtime_stats(session, kchan,
269 &discarded_events, &lost_packets);
270 if (ret < 0) {
271 goto end;
272 }
2f77fc4b
DG
273 /* Copy lttng_channel struct to array */
274 memcpy(&channels[i], kchan->channel, sizeof(struct lttng_channel));
275 channels[i].enabled = kchan->enabled;
fb83fe64
JD
276 chan_exts[i].discarded_events =
277 discarded_events;
278 chan_exts[i].lost_packets = lost_packets;
cf0bcb51
JG
279 chan_exts[i].monitor_timer_interval =
280 extended->monitor_timer_interval;
491d1539 281 chan_exts[i].blocking_timeout = 0;
2f77fc4b
DG
282 i++;
283 }
284 }
285 break;
286 case LTTNG_DOMAIN_UST:
287 {
288 struct lttng_ht_iter iter;
289 struct ltt_ust_channel *uchan;
290
e7fe706f 291 rcu_read_lock();
2f77fc4b
DG
292 cds_lfht_for_each_entry(session->ust_session->domain_global.channels->ht,
293 &iter.iter, uchan, node.node) {
a91c5803 294 uint64_t discarded_events = 0, lost_packets = 0;
fb83fe64 295
8ee609c8
MD
296 if (lttng_strncpy(channels[i].name, uchan->name,
297 LTTNG_SYMBOL_NAME_LEN)) {
298 break;
299 }
2f77fc4b
DG
300 channels[i].attr.overwrite = uchan->attr.overwrite;
301 channels[i].attr.subbuf_size = uchan->attr.subbuf_size;
302 channels[i].attr.num_subbuf = uchan->attr.num_subbuf;
303 channels[i].attr.switch_timer_interval =
304 uchan->attr.switch_timer_interval;
305 channels[i].attr.read_timer_interval =
306 uchan->attr.read_timer_interval;
307 channels[i].enabled = uchan->enabled;
2f785fe7
DG
308 channels[i].attr.tracefile_size = uchan->tracefile_size;
309 channels[i].attr.tracefile_count = uchan->tracefile_count;
5e4435a4
JG
310
311 /*
312 * Map enum lttng_ust_output to enum lttng_event_output.
313 */
2f77fc4b
DG
314 switch (uchan->attr.output) {
315 case LTTNG_UST_MMAP:
2f77fc4b
DG
316 channels[i].attr.output = LTTNG_EVENT_MMAP;
317 break;
5e4435a4
JG
318 default:
319 /*
320 * LTTNG_UST_MMAP is the only supported UST
321 * output mode.
322 */
323 assert(0);
324 break;
2f77fc4b 325 }
fb83fe64 326
d449df4a
MD
327 chan_exts[i].monitor_timer_interval =
328 uchan->monitor_timer_interval;
491d1539
MD
329 chan_exts[i].blocking_timeout =
330 uchan->attr.u.s.blocking_timeout;
d449df4a 331
fb83fe64
JD
332 ret = get_ust_runtime_stats(session, uchan,
333 &discarded_events, &lost_packets);
334 if (ret < 0) {
335 break;
336 }
337 chan_exts[i].discarded_events = discarded_events;
338 chan_exts[i].lost_packets = lost_packets;
2f77fc4b
DG
339 i++;
340 }
e7fe706f 341 rcu_read_unlock();
2f77fc4b
DG
342 break;
343 }
344 default:
345 break;
346 }
fb83fe64
JD
347
348end:
d449df4a
MD
349 if (ret < 0) {
350 return -LTTNG_ERR_FATAL;
351 } else {
352 return LTTNG_OK;
353 }
2f77fc4b
DG
354}
355
b4e3ceb9 356static void increment_extended_len(const char *filter_expression,
795d57ce 357 struct lttng_event_exclusion *exclusion, size_t *extended_len)
b4e3ceb9
PP
358{
359 *extended_len += sizeof(struct lttcomm_event_extended_header);
360
361 if (filter_expression) {
362 *extended_len += strlen(filter_expression) + 1;
363 }
795d57ce
PP
364
365 if (exclusion) {
366 *extended_len += exclusion->count * LTTNG_SYMBOL_NAME_LEN;
367 }
b4e3ceb9
PP
368}
369
370static void append_extended_info(const char *filter_expression,
795d57ce 371 struct lttng_event_exclusion *exclusion, void **extended_at)
b4e3ceb9
PP
372{
373 struct lttcomm_event_extended_header extended_header;
374 size_t filter_len = 0;
795d57ce 375 size_t nb_exclusions = 0;
b4e3ceb9
PP
376
377 if (filter_expression) {
378 filter_len = strlen(filter_expression) + 1;
379 }
380
795d57ce
PP
381 if (exclusion) {
382 nb_exclusions = exclusion->count;
383 }
384
385 /* Set header fields */
b4e3ceb9 386 extended_header.filter_len = filter_len;
795d57ce
PP
387 extended_header.nb_exclusions = nb_exclusions;
388
389 /* Copy header */
b4e3ceb9
PP
390 memcpy(*extended_at, &extended_header, sizeof(extended_header));
391 *extended_at += sizeof(extended_header);
795d57ce
PP
392
393 /* Copy filter string */
394 if (filter_expression) {
395 memcpy(*extended_at, filter_expression, filter_len);
396 *extended_at += filter_len;
397 }
398
399 /* Copy exclusion names */
400 if (exclusion) {
401 size_t len = nb_exclusions * LTTNG_SYMBOL_NAME_LEN;
402
403 memcpy(*extended_at, &exclusion->names, len);
404 *extended_at += len;
405 }
b4e3ceb9
PP
406}
407
3c6a091f 408/*
022d91ba 409 * Create a list of agent domain events.
3c6a091f
DG
410 *
411 * Return number of events in list on success or else a negative value.
412 */
022d91ba 413static int list_lttng_agent_events(struct agent *agt,
b4e3ceb9 414 struct lttng_event **events, size_t *total_size)
3c6a091f
DG
415{
416 int i = 0, ret = 0;
417 unsigned int nb_event = 0;
022d91ba 418 struct agent_event *event;
3c6a091f
DG
419 struct lttng_event *tmp_events;
420 struct lttng_ht_iter iter;
b4e3ceb9
PP
421 size_t extended_len = 0;
422 void *extended_at;
3c6a091f 423
022d91ba 424 assert(agt);
3c6a091f
DG
425 assert(events);
426
022d91ba 427 DBG3("Listing agent events");
3c6a091f 428
e5bbf678 429 rcu_read_lock();
022d91ba 430 nb_event = lttng_ht_get_count(agt->events);
e5bbf678 431 rcu_read_unlock();
3c6a091f
DG
432 if (nb_event == 0) {
433 ret = nb_event;
b4e3ceb9 434 *total_size = 0;
3c6a091f
DG
435 goto error;
436 }
437
b4e3ceb9
PP
438 /* Compute required extended infos size */
439 extended_len = nb_event * sizeof(struct lttcomm_event_extended_header);
440
441 /*
442 * This is only valid because the commands which add events are
443 * processed in the same thread as the listing.
444 */
445 rcu_read_lock();
446 cds_lfht_for_each_entry(agt->events->ht, &iter.iter, event, node.node) {
795d57ce
PP
447 increment_extended_len(event->filter_expression, NULL,
448 &extended_len);
b4e3ceb9
PP
449 }
450 rcu_read_unlock();
451
452 *total_size = nb_event * sizeof(*tmp_events) + extended_len;
453 tmp_events = zmalloc(*total_size);
3c6a091f 454 if (!tmp_events) {
022d91ba 455 PERROR("zmalloc agent events session");
3c6a091f
DG
456 ret = -LTTNG_ERR_FATAL;
457 goto error;
458 }
459
b4e3ceb9
PP
460 extended_at = ((uint8_t *) tmp_events) +
461 nb_event * sizeof(struct lttng_event);
462
3c6a091f 463 rcu_read_lock();
022d91ba 464 cds_lfht_for_each_entry(agt->events->ht, &iter.iter, event, node.node) {
3c6a091f
DG
465 strncpy(tmp_events[i].name, event->name, sizeof(tmp_events[i].name));
466 tmp_events[i].name[sizeof(tmp_events[i].name) - 1] = '\0';
467 tmp_events[i].enabled = event->enabled;
2106efa0 468 tmp_events[i].loglevel = event->loglevel_value;
ff94328f 469 tmp_events[i].loglevel_type = event->loglevel_type;
3c6a091f 470 i++;
b4e3ceb9
PP
471
472 /* Append extended info */
795d57ce
PP
473 append_extended_info(event->filter_expression, NULL,
474 &extended_at);
3c6a091f
DG
475 }
476 rcu_read_unlock();
477
478 *events = tmp_events;
479 ret = nb_event;
480
481error:
482 assert(nb_event == i);
483 return ret;
484}
485
2f77fc4b
DG
486/*
487 * Create a list of ust global domain events.
488 */
489static int list_lttng_ust_global_events(char *channel_name,
b4e3ceb9
PP
490 struct ltt_ust_domain_global *ust_global,
491 struct lttng_event **events, size_t *total_size)
2f77fc4b
DG
492{
493 int i = 0, ret = 0;
494 unsigned int nb_event = 0;
495 struct lttng_ht_iter iter;
496 struct lttng_ht_node_str *node;
497 struct ltt_ust_channel *uchan;
498 struct ltt_ust_event *uevent;
499 struct lttng_event *tmp;
b4e3ceb9
PP
500 size_t extended_len = 0;
501 void *extended_at;
2f77fc4b
DG
502
503 DBG("Listing UST global events for channel %s", channel_name);
504
505 rcu_read_lock();
506
507 lttng_ht_lookup(ust_global->channels, (void *)channel_name, &iter);
508 node = lttng_ht_iter_get_node_str(&iter);
509 if (node == NULL) {
f73fabfd 510 ret = LTTNG_ERR_UST_CHAN_NOT_FOUND;
d31d3e8c 511 goto end;
2f77fc4b
DG
512 }
513
514 uchan = caa_container_of(&node->node, struct ltt_ust_channel, node.node);
515
3c442be3 516 nb_event = lttng_ht_get_count(uchan->events);
2f77fc4b
DG
517 if (nb_event == 0) {
518 ret = nb_event;
b4e3ceb9 519 *total_size = 0;
d31d3e8c 520 goto end;
2f77fc4b
DG
521 }
522
523 DBG3("Listing UST global %d events", nb_event);
524
b4e3ceb9
PP
525 /* Compute required extended infos size */
526 cds_lfht_for_each_entry(uchan->events->ht, &iter.iter, uevent, node.node) {
527 if (uevent->internal) {
528 nb_event--;
529 continue;
530 }
531
532 increment_extended_len(uevent->filter_expression,
795d57ce 533 uevent->exclusion, &extended_len);
b4e3ceb9 534 }
d31d3e8c
PP
535 if (nb_event == 0) {
536 /* All events are internal, skip. */
537 ret = 0;
538 *total_size = 0;
539 goto end;
540 }
b4e3ceb9
PP
541
542 *total_size = nb_event * sizeof(struct lttng_event) + extended_len;
543 tmp = zmalloc(*total_size);
2f77fc4b 544 if (tmp == NULL) {
b12c38df
JG
545 ret = -LTTNG_ERR_FATAL;
546 goto end;
2f77fc4b
DG
547 }
548
b4e3ceb9
PP
549 extended_at = ((uint8_t *) tmp) + nb_event * sizeof(struct lttng_event);
550
2f77fc4b 551 cds_lfht_for_each_entry(uchan->events->ht, &iter.iter, uevent, node.node) {
3c442be3
JG
552 if (uevent->internal) {
553 /* This event should remain hidden from clients */
3c442be3
JG
554 continue;
555 }
2f77fc4b
DG
556 strncpy(tmp[i].name, uevent->attr.name, LTTNG_SYMBOL_NAME_LEN);
557 tmp[i].name[LTTNG_SYMBOL_NAME_LEN - 1] = '\0';
558 tmp[i].enabled = uevent->enabled;
559
560 switch (uevent->attr.instrumentation) {
561 case LTTNG_UST_TRACEPOINT:
562 tmp[i].type = LTTNG_EVENT_TRACEPOINT;
563 break;
564 case LTTNG_UST_PROBE:
565 tmp[i].type = LTTNG_EVENT_PROBE;
566 break;
567 case LTTNG_UST_FUNCTION:
568 tmp[i].type = LTTNG_EVENT_FUNCTION;
569 break;
570 }
571
572 tmp[i].loglevel = uevent->attr.loglevel;
573 switch (uevent->attr.loglevel_type) {
574 case LTTNG_UST_LOGLEVEL_ALL:
575 tmp[i].loglevel_type = LTTNG_EVENT_LOGLEVEL_ALL;
576 break;
577 case LTTNG_UST_LOGLEVEL_RANGE:
578 tmp[i].loglevel_type = LTTNG_EVENT_LOGLEVEL_RANGE;
579 break;
580 case LTTNG_UST_LOGLEVEL_SINGLE:
581 tmp[i].loglevel_type = LTTNG_EVENT_LOGLEVEL_SINGLE;
582 break;
583 }
584 if (uevent->filter) {
585 tmp[i].filter = 1;
586 }
4634f12e
JI
587 if (uevent->exclusion) {
588 tmp[i].exclusion = 1;
589 }
2f77fc4b 590 i++;
b4e3ceb9
PP
591
592 /* Append extended info */
795d57ce
PP
593 append_extended_info(uevent->filter_expression,
594 uevent->exclusion, &extended_at);
2f77fc4b
DG
595 }
596
597 ret = nb_event;
598 *events = tmp;
d31d3e8c 599end:
2f77fc4b
DG
600 rcu_read_unlock();
601 return ret;
602}
603
604/*
605 * Fill lttng_event array of all kernel events in the channel.
606 */
607static int list_lttng_kernel_events(char *channel_name,
b4e3ceb9
PP
608 struct ltt_kernel_session *kernel_session,
609 struct lttng_event **events, size_t *total_size)
2f77fc4b
DG
610{
611 int i = 0, ret;
612 unsigned int nb_event;
613 struct ltt_kernel_event *event;
614 struct ltt_kernel_channel *kchan;
b4e3ceb9
PP
615 size_t extended_len = 0;
616 void *extended_at;
2f77fc4b
DG
617
618 kchan = trace_kernel_get_channel_by_name(channel_name, kernel_session);
619 if (kchan == NULL) {
f73fabfd 620 ret = LTTNG_ERR_KERN_CHAN_NOT_FOUND;
2f77fc4b
DG
621 goto error;
622 }
623
624 nb_event = kchan->event_count;
625
626 DBG("Listing events for channel %s", kchan->channel->name);
627
628 if (nb_event == 0) {
b4e3ceb9 629 *total_size = 0;
834978fd 630 *events = NULL;
db906c12 631 goto end;
2f77fc4b
DG
632 }
633
b4e3ceb9
PP
634 /* Compute required extended infos size */
635 cds_list_for_each_entry(event, &kchan->events_list.head, list) {
795d57ce
PP
636 increment_extended_len(event->filter_expression, NULL,
637 &extended_len);
b4e3ceb9
PP
638 }
639
640 *total_size = nb_event * sizeof(struct lttng_event) + extended_len;
641 *events = zmalloc(*total_size);
2f77fc4b 642 if (*events == NULL) {
f73fabfd 643 ret = LTTNG_ERR_FATAL;
2f77fc4b
DG
644 goto error;
645 }
646
ab4aa612 647 extended_at = ((void *) *events) +
b4e3ceb9
PP
648 nb_event * sizeof(struct lttng_event);
649
2f77fc4b
DG
650 /* Kernel channels */
651 cds_list_for_each_entry(event, &kchan->events_list.head , list) {
652 strncpy((*events)[i].name, event->event->name, LTTNG_SYMBOL_NAME_LEN);
653 (*events)[i].name[LTTNG_SYMBOL_NAME_LEN - 1] = '\0';
654 (*events)[i].enabled = event->enabled;
00f992f2
JG
655 (*events)[i].filter =
656 (unsigned char) !!event->filter_expression;
2f77fc4b
DG
657
658 switch (event->event->instrumentation) {
659 case LTTNG_KERNEL_TRACEPOINT:
660 (*events)[i].type = LTTNG_EVENT_TRACEPOINT;
661 break;
2f77fc4b 662 case LTTNG_KERNEL_KRETPROBE:
1896972b
DG
663 (*events)[i].type = LTTNG_EVENT_FUNCTION;
664 memcpy(&(*events)[i].attr.probe, &event->event->u.kprobe,
665 sizeof(struct lttng_kernel_kprobe));
666 break;
667 case LTTNG_KERNEL_KPROBE:
2f77fc4b
DG
668 (*events)[i].type = LTTNG_EVENT_PROBE;
669 memcpy(&(*events)[i].attr.probe, &event->event->u.kprobe,
670 sizeof(struct lttng_kernel_kprobe));
671 break;
672 case LTTNG_KERNEL_FUNCTION:
673 (*events)[i].type = LTTNG_EVENT_FUNCTION;
674 memcpy(&((*events)[i].attr.ftrace), &event->event->u.ftrace,
675 sizeof(struct lttng_kernel_function));
676 break;
677 case LTTNG_KERNEL_NOOP:
678 (*events)[i].type = LTTNG_EVENT_NOOP;
679 break;
680 case LTTNG_KERNEL_SYSCALL:
681 (*events)[i].type = LTTNG_EVENT_SYSCALL;
682 break;
683 case LTTNG_KERNEL_ALL:
684 assert(0);
685 break;
686 }
687 i++;
b4e3ceb9
PP
688
689 /* Append extended info */
795d57ce
PP
690 append_extended_info(event->filter_expression, NULL,
691 &extended_at);
2f77fc4b
DG
692 }
693
db906c12 694end:
2f77fc4b
DG
695 return nb_event;
696
697error:
f73fabfd
DG
698 /* Negate the error code to differentiate the size from an error */
699 return -ret;
2f77fc4b
DG
700}
701
702/*
703 * Add URI so the consumer output object. Set the correct path depending on the
704 * domain adding the default trace directory.
705 */
706static int add_uri_to_consumer(struct consumer_output *consumer,
56a37563
JG
707 struct lttng_uri *uri, enum lttng_domain_type domain,
708 const char *session_name)
2f77fc4b 709{
f73fabfd 710 int ret = LTTNG_OK;
2f77fc4b
DG
711 const char *default_trace_dir;
712
713 assert(uri);
714
715 if (consumer == NULL) {
716 DBG("No consumer detected. Don't add URI. Stopping.");
f73fabfd 717 ret = LTTNG_ERR_NO_CONSUMER;
2f77fc4b
DG
718 goto error;
719 }
720
721 switch (domain) {
722 case LTTNG_DOMAIN_KERNEL:
723 default_trace_dir = DEFAULT_KERNEL_TRACE_DIR;
724 break;
725 case LTTNG_DOMAIN_UST:
726 default_trace_dir = DEFAULT_UST_TRACE_DIR;
727 break;
728 default:
729 /*
730 * This case is possible is we try to add the URI to the global tracing
731 * session consumer object which in this case there is no subdir.
732 */
733 default_trace_dir = "";
734 }
735
736 switch (uri->dtype) {
737 case LTTNG_DST_IPV4:
738 case LTTNG_DST_IPV6:
739 DBG2("Setting network URI to consumer");
740
df75acac
DG
741 if (consumer->type == CONSUMER_DST_NET) {
742 if ((uri->stype == LTTNG_STREAM_CONTROL &&
785d2d0d
DG
743 consumer->dst.net.control_isset) ||
744 (uri->stype == LTTNG_STREAM_DATA &&
745 consumer->dst.net.data_isset)) {
df75acac
DG
746 ret = LTTNG_ERR_URL_EXIST;
747 goto error;
748 }
749 } else {
750 memset(&consumer->dst.net, 0, sizeof(consumer->dst.net));
785d2d0d
DG
751 }
752
df75acac
DG
753 consumer->type = CONSUMER_DST_NET;
754
2f77fc4b
DG
755 /* Set URI into consumer output object */
756 ret = consumer_set_network_uri(consumer, uri);
757 if (ret < 0) {
a74934ba 758 ret = -ret;
2f77fc4b
DG
759 goto error;
760 } else if (ret == 1) {
761 /*
762 * URI was the same in the consumer so we do not append the subdir
763 * again so to not duplicate output dir.
764 */
f86c9f4e 765 ret = LTTNG_OK;
2f77fc4b
DG
766 goto error;
767 }
768
769 if (uri->stype == LTTNG_STREAM_CONTROL && strlen(uri->subdir) == 0) {
770 ret = consumer_set_subdir(consumer, session_name);
771 if (ret < 0) {
f73fabfd 772 ret = LTTNG_ERR_FATAL;
2f77fc4b
DG
773 goto error;
774 }
775 }
776
777 if (uri->stype == LTTNG_STREAM_CONTROL) {
778 /* On a new subdir, reappend the default trace dir. */
c30ce0b3
CB
779 strncat(consumer->subdir, default_trace_dir,
780 sizeof(consumer->subdir) - strlen(consumer->subdir) - 1);
2f77fc4b
DG
781 DBG3("Append domain trace name to subdir %s", consumer->subdir);
782 }
783
784 break;
785 case LTTNG_DST_PATH:
786 DBG2("Setting trace directory path from URI to %s", uri->dst.path);
787 memset(consumer->dst.trace_path, 0,
788 sizeof(consumer->dst.trace_path));
9ac05d92
MD
789 /* Explicit length checks for strcpy and strcat. */
790 if (strlen(uri->dst.path) + strlen(default_trace_dir)
791 >= sizeof(consumer->dst.trace_path)) {
792 ret = LTTNG_ERR_FATAL;
793 goto error;
794 }
795 strcpy(consumer->dst.trace_path, uri->dst.path);
2f77fc4b 796 /* Append default trace dir */
9ac05d92 797 strcat(consumer->dst.trace_path, default_trace_dir);
2f77fc4b
DG
798 /* Flag consumer as local. */
799 consumer->type = CONSUMER_DST_LOCAL;
800 break;
801 }
802
a74934ba
DG
803 ret = LTTNG_OK;
804
2f77fc4b
DG
805error:
806 return ret;
807}
808
809/*
810 * Init tracing by creating trace directory and sending fds kernel consumer.
811 */
812static int init_kernel_tracing(struct ltt_kernel_session *session)
813{
814 int ret = 0;
815 struct lttng_ht_iter iter;
816 struct consumer_socket *socket;
817
818 assert(session);
819
e7fe706f
DG
820 rcu_read_lock();
821
2f77fc4b
DG
822 if (session->consumer_fds_sent == 0 && session->consumer != NULL) {
823 cds_lfht_for_each_entry(session->consumer->socks->ht, &iter.iter,
824 socket, node.node) {
2f77fc4b 825 pthread_mutex_lock(socket->lock);
f50f23d9 826 ret = kernel_consumer_send_session(socket, session);
2f77fc4b
DG
827 pthread_mutex_unlock(socket->lock);
828 if (ret < 0) {
f73fabfd 829 ret = LTTNG_ERR_KERN_CONSUMER_FAIL;
2f77fc4b
DG
830 goto error;
831 }
832 }
833 }
834
835error:
e7fe706f 836 rcu_read_unlock();
2f77fc4b
DG
837 return ret;
838}
839
840/*
841 * Create a socket to the relayd using the URI.
842 *
843 * On success, the relayd_sock pointer is set to the created socket.
844 * Else, it's stays untouched and a lttcomm error code is returned.
845 */
6151a90f 846static int create_connect_relayd(struct lttng_uri *uri,
b31610f2
JD
847 struct lttcomm_relayd_sock **relayd_sock,
848 struct consumer_output *consumer)
2f77fc4b
DG
849{
850 int ret;
6151a90f 851 struct lttcomm_relayd_sock *rsock;
2f77fc4b 852
6151a90f
JD
853 rsock = lttcomm_alloc_relayd_sock(uri, RELAYD_VERSION_COMM_MAJOR,
854 RELAYD_VERSION_COMM_MINOR);
855 if (!rsock) {
f73fabfd 856 ret = LTTNG_ERR_FATAL;
2f77fc4b
DG
857 goto error;
858 }
859
ffe60014
DG
860 /*
861 * Connect to relayd so we can proceed with a session creation. This call
862 * can possibly block for an arbitrary amount of time to set the health
863 * state to be in poll execution.
864 */
865 health_poll_entry();
6151a90f 866 ret = relayd_connect(rsock);
ffe60014 867 health_poll_exit();
2f77fc4b
DG
868 if (ret < 0) {
869 ERR("Unable to reach lttng-relayd");
f73fabfd 870 ret = LTTNG_ERR_RELAYD_CONNECT_FAIL;
2f77fc4b
DG
871 goto free_sock;
872 }
873
874 /* Create socket for control stream. */
875 if (uri->stype == LTTNG_STREAM_CONTROL) {
876 DBG3("Creating relayd stream socket from URI");
877
878 /* Check relayd version */
6151a90f 879 ret = relayd_version_check(rsock);
2f77fc4b 880 if (ret < 0) {
f73fabfd 881 ret = LTTNG_ERR_RELAYD_VERSION_FAIL;
2f77fc4b
DG
882 goto close_sock;
883 }
b31610f2
JD
884 consumer->relay_major_version = rsock->major;
885 consumer->relay_minor_version = rsock->minor;
2f77fc4b
DG
886 } else if (uri->stype == LTTNG_STREAM_DATA) {
887 DBG3("Creating relayd data socket from URI");
888 } else {
889 /* Command is not valid */
890 ERR("Relayd invalid stream type: %d", uri->stype);
f73fabfd 891 ret = LTTNG_ERR_INVALID;
2f77fc4b
DG
892 goto close_sock;
893 }
894
6151a90f 895 *relayd_sock = rsock;
2f77fc4b 896
f73fabfd 897 return LTTNG_OK;
2f77fc4b
DG
898
899close_sock:
6151a90f
JD
900 /* The returned value is not useful since we are on an error path. */
901 (void) relayd_close(rsock);
2f77fc4b 902free_sock:
6151a90f 903 free(rsock);
2f77fc4b
DG
904error:
905 return ret;
906}
907
908/*
909 * Connect to the relayd using URI and send the socket to the right consumer.
43fade62
JG
910 *
911 * The consumer socket lock must be held by the caller.
2f77fc4b 912 */
56a37563
JG
913static int send_consumer_relayd_socket(enum lttng_domain_type domain,
914 unsigned int session_id, struct lttng_uri *relayd_uri,
915 struct consumer_output *consumer,
d3e2ba59
JD
916 struct consumer_socket *consumer_sock,
917 char *session_name, char *hostname, int session_live_timer)
2f77fc4b
DG
918{
919 int ret;
6151a90f 920 struct lttcomm_relayd_sock *rsock = NULL;
2f77fc4b 921
ffe60014 922 /* Connect to relayd and make version check if uri is the control. */
b31610f2 923 ret = create_connect_relayd(relayd_uri, &rsock, consumer);
ffe60014 924 if (ret != LTTNG_OK) {
9e218353 925 goto relayd_comm_error;
ffe60014 926 }
6151a90f 927 assert(rsock);
ffe60014 928
2f77fc4b 929 /* Set the network sequence index if not set. */
d88aee68
DG
930 if (consumer->net_seq_index == (uint64_t) -1ULL) {
931 pthread_mutex_lock(&relayd_net_seq_idx_lock);
2f77fc4b
DG
932 /*
933 * Increment net_seq_idx because we are about to transfer the
934 * new relayd socket to the consumer.
d88aee68 935 * Assign unique key so the consumer can match streams.
2f77fc4b 936 */
d88aee68
DG
937 consumer->net_seq_index = ++relayd_net_seq_idx;
938 pthread_mutex_unlock(&relayd_net_seq_idx_lock);
2f77fc4b
DG
939 }
940
2f77fc4b 941 /* Send relayd socket to consumer. */
6151a90f 942 ret = consumer_send_relayd_socket(consumer_sock, rsock, consumer,
d3e2ba59
JD
943 relayd_uri->stype, session_id,
944 session_name, hostname, session_live_timer);
2f77fc4b 945 if (ret < 0) {
f73fabfd 946 ret = LTTNG_ERR_ENABLE_CONSUMER_FAIL;
2f77fc4b
DG
947 goto close_sock;
948 }
949
c890b720
DG
950 /* Flag that the corresponding socket was sent. */
951 if (relayd_uri->stype == LTTNG_STREAM_CONTROL) {
ffe60014 952 consumer_sock->control_sock_sent = 1;
c890b720 953 } else if (relayd_uri->stype == LTTNG_STREAM_DATA) {
ffe60014 954 consumer_sock->data_sock_sent = 1;
c890b720
DG
955 }
956
f73fabfd 957 ret = LTTNG_OK;
2f77fc4b
DG
958
959 /*
960 * Close socket which was dup on the consumer side. The session daemon does
961 * NOT keep track of the relayd socket(s) once transfer to the consumer.
962 */
963
964close_sock:
ffe60014
DG
965 if (ret != LTTNG_OK) {
966 /*
d9078d0c
DG
967 * The consumer output for this session should not be used anymore
968 * since the relayd connection failed thus making any tracing or/and
969 * streaming not usable.
ffe60014 970 */
d9078d0c 971 consumer->enabled = 0;
ffe60014 972 }
9e218353
JR
973 (void) relayd_close(rsock);
974 free(rsock);
975
976relayd_comm_error:
2f77fc4b
DG
977 return ret;
978}
979
980/*
981 * Send both relayd sockets to a specific consumer and domain. This is a
982 * helper function to facilitate sending the information to the consumer for a
983 * session.
43fade62
JG
984 *
985 * The consumer socket lock must be held by the caller.
2f77fc4b 986 */
56a37563
JG
987static int send_consumer_relayd_sockets(enum lttng_domain_type domain,
988 unsigned int session_id, struct consumer_output *consumer,
989 struct consumer_socket *sock, char *session_name,
990 char *hostname, int session_live_timer)
2f77fc4b 991{
dda67f6c 992 int ret = LTTNG_OK;
2f77fc4b 993
2f77fc4b 994 assert(consumer);
6dc3064a 995 assert(sock);
2f77fc4b 996
2f77fc4b 997 /* Sending control relayd socket. */
ffe60014 998 if (!sock->control_sock_sent) {
6dc3064a 999 ret = send_consumer_relayd_socket(domain, session_id,
d3e2ba59
JD
1000 &consumer->dst.net.control, consumer, sock,
1001 session_name, hostname, session_live_timer);
c890b720
DG
1002 if (ret != LTTNG_OK) {
1003 goto error;
1004 }
2f77fc4b
DG
1005 }
1006
1007 /* Sending data relayd socket. */
ffe60014 1008 if (!sock->data_sock_sent) {
6dc3064a 1009 ret = send_consumer_relayd_socket(domain, session_id,
d3e2ba59
JD
1010 &consumer->dst.net.data, consumer, sock,
1011 session_name, hostname, session_live_timer);
c890b720
DG
1012 if (ret != LTTNG_OK) {
1013 goto error;
1014 }
2f77fc4b
DG
1015 }
1016
2f77fc4b
DG
1017error:
1018 return ret;
1019}
1020
1021/*
1022 * Setup relayd connections for a tracing session. First creates the socket to
1023 * the relayd and send them to the right domain consumer. Consumer type MUST be
1024 * network.
1025 */
ffe60014 1026int cmd_setup_relayd(struct ltt_session *session)
2f77fc4b 1027{
f73fabfd 1028 int ret = LTTNG_OK;
2f77fc4b
DG
1029 struct ltt_ust_session *usess;
1030 struct ltt_kernel_session *ksess;
1031 struct consumer_socket *socket;
1032 struct lttng_ht_iter iter;
1033
1034 assert(session);
1035
1036 usess = session->ust_session;
1037 ksess = session->kernel_session;
1038
785d2d0d 1039 DBG("Setting relayd for session %s", session->name);
2f77fc4b 1040
e7fe706f
DG
1041 rcu_read_lock();
1042
2f77fc4b
DG
1043 if (usess && usess->consumer && usess->consumer->type == CONSUMER_DST_NET
1044 && usess->consumer->enabled) {
1045 /* For each consumer socket, send relayd sockets */
1046 cds_lfht_for_each_entry(usess->consumer->socks->ht, &iter.iter,
1047 socket, node.node) {
2f77fc4b 1048 pthread_mutex_lock(socket->lock);
6dc3064a 1049 ret = send_consumer_relayd_sockets(LTTNG_DOMAIN_UST, session->id,
d3e2ba59
JD
1050 usess->consumer, socket,
1051 session->name, session->hostname,
1052 session->live_timer);
2f77fc4b 1053 pthread_mutex_unlock(socket->lock);
f73fabfd 1054 if (ret != LTTNG_OK) {
2f77fc4b
DG
1055 goto error;
1056 }
6dc3064a
DG
1057 /* Session is now ready for network streaming. */
1058 session->net_handle = 1;
2f77fc4b 1059 }
b31610f2
JD
1060 session->consumer->relay_major_version =
1061 usess->consumer->relay_major_version;
1062 session->consumer->relay_minor_version =
1063 usess->consumer->relay_minor_version;
2f77fc4b
DG
1064 }
1065
1066 if (ksess && ksess->consumer && ksess->consumer->type == CONSUMER_DST_NET
1067 && ksess->consumer->enabled) {
1068 cds_lfht_for_each_entry(ksess->consumer->socks->ht, &iter.iter,
1069 socket, node.node) {
2f77fc4b 1070 pthread_mutex_lock(socket->lock);
6dc3064a 1071 ret = send_consumer_relayd_sockets(LTTNG_DOMAIN_KERNEL, session->id,
d3e2ba59
JD
1072 ksess->consumer, socket,
1073 session->name, session->hostname,
1074 session->live_timer);
2f77fc4b 1075 pthread_mutex_unlock(socket->lock);
f73fabfd 1076 if (ret != LTTNG_OK) {
2f77fc4b
DG
1077 goto error;
1078 }
6dc3064a
DG
1079 /* Session is now ready for network streaming. */
1080 session->net_handle = 1;
2f77fc4b 1081 }
b31610f2
JD
1082 session->consumer->relay_major_version =
1083 ksess->consumer->relay_major_version;
1084 session->consumer->relay_minor_version =
1085 ksess->consumer->relay_minor_version;
2f77fc4b
DG
1086 }
1087
1088error:
e7fe706f 1089 rcu_read_unlock();
2f77fc4b
DG
1090 return ret;
1091}
1092
9b6c7ec5
DG
1093/*
1094 * Start a kernel session by opening all necessary streams.
1095 */
1096static int start_kernel_session(struct ltt_kernel_session *ksess, int wpipe)
1097{
1098 int ret;
1099 struct ltt_kernel_channel *kchan;
1100
1101 /* Open kernel metadata */
07b86b52 1102 if (ksess->metadata == NULL && ksess->output_traces) {
9b6c7ec5
DG
1103 ret = kernel_open_metadata(ksess);
1104 if (ret < 0) {
1105 ret = LTTNG_ERR_KERN_META_FAIL;
1106 goto error;
1107 }
1108 }
1109
1110 /* Open kernel metadata stream */
07b86b52 1111 if (ksess->metadata && ksess->metadata_stream_fd < 0) {
9b6c7ec5
DG
1112 ret = kernel_open_metadata_stream(ksess);
1113 if (ret < 0) {
1114 ERR("Kernel create metadata stream failed");
1115 ret = LTTNG_ERR_KERN_STREAM_FAIL;
1116 goto error;
1117 }
1118 }
1119
1120 /* For each channel */
1121 cds_list_for_each_entry(kchan, &ksess->channel_list.head, list) {
1122 if (kchan->stream_count == 0) {
1123 ret = kernel_open_channel_stream(kchan);
1124 if (ret < 0) {
1125 ret = LTTNG_ERR_KERN_STREAM_FAIL;
1126 goto error;
1127 }
1128 /* Update the stream global counter */
1129 ksess->stream_count_global += ret;
1130 }
1131 }
1132
1133 /* Setup kernel consumer socket and send fds to it */
1134 ret = init_kernel_tracing(ksess);
e43c41c5 1135 if (ret != 0) {
9b6c7ec5
DG
1136 ret = LTTNG_ERR_KERN_START_FAIL;
1137 goto error;
1138 }
1139
1140 /* This start the kernel tracing */
1141 ret = kernel_start_session(ksess);
1142 if (ret < 0) {
1143 ret = LTTNG_ERR_KERN_START_FAIL;
1144 goto error;
1145 }
1146
1147 /* Quiescent wait after starting trace */
784303b0 1148 kernel_wait_quiescent(kernel_tracer_fd);
9b6c7ec5 1149
14fb1ebe 1150 ksess->active = 1;
9b6c7ec5
DG
1151
1152 ret = LTTNG_OK;
1153
1154error:
1155 return ret;
1156}
1157
2f77fc4b
DG
1158/*
1159 * Command LTTNG_DISABLE_CHANNEL processed by the client thread.
1160 */
56a37563
JG
1161int cmd_disable_channel(struct ltt_session *session,
1162 enum lttng_domain_type domain, char *channel_name)
2f77fc4b
DG
1163{
1164 int ret;
1165 struct ltt_ust_session *usess;
1166
1167 usess = session->ust_session;
1168
2223c96f
DG
1169 rcu_read_lock();
1170
2f77fc4b
DG
1171 switch (domain) {
1172 case LTTNG_DOMAIN_KERNEL:
1173 {
1174 ret = channel_kernel_disable(session->kernel_session,
1175 channel_name);
f73fabfd 1176 if (ret != LTTNG_OK) {
2f77fc4b
DG
1177 goto error;
1178 }
1179
1180 kernel_wait_quiescent(kernel_tracer_fd);
1181 break;
1182 }
1183 case LTTNG_DOMAIN_UST:
1184 {
1185 struct ltt_ust_channel *uchan;
1186 struct lttng_ht *chan_ht;
1187
1188 chan_ht = usess->domain_global.channels;
1189
1190 uchan = trace_ust_find_channel_by_name(chan_ht, channel_name);
1191 if (uchan == NULL) {
f73fabfd 1192 ret = LTTNG_ERR_UST_CHAN_NOT_FOUND;
2f77fc4b
DG
1193 goto error;
1194 }
1195
7972aab2 1196 ret = channel_ust_disable(usess, uchan);
f73fabfd 1197 if (ret != LTTNG_OK) {
2f77fc4b
DG
1198 goto error;
1199 }
1200 break;
1201 }
2f77fc4b 1202 default:
f73fabfd 1203 ret = LTTNG_ERR_UNKNOWN_DOMAIN;
2f77fc4b
DG
1204 goto error;
1205 }
1206
f73fabfd 1207 ret = LTTNG_OK;
2f77fc4b
DG
1208
1209error:
2223c96f 1210 rcu_read_unlock();
2f77fc4b
DG
1211 return ret;
1212}
1213
ccf10263
MD
1214/*
1215 * Command LTTNG_TRACK_PID processed by the client thread.
a9ad0c8f
MD
1216 *
1217 * Called with session lock held.
ccf10263 1218 */
56a37563
JG
1219int cmd_track_pid(struct ltt_session *session, enum lttng_domain_type domain,
1220 int pid)
ccf10263
MD
1221{
1222 int ret;
1223
1224 rcu_read_lock();
1225
1226 switch (domain) {
1227 case LTTNG_DOMAIN_KERNEL:
1228 {
1229 struct ltt_kernel_session *ksess;
1230
1231 ksess = session->kernel_session;
1232
1233 ret = kernel_track_pid(ksess, pid);
1234 if (ret != LTTNG_OK) {
1235 goto error;
1236 }
1237
1238 kernel_wait_quiescent(kernel_tracer_fd);
1239 break;
1240 }
ccf10263 1241 case LTTNG_DOMAIN_UST:
a9ad0c8f
MD
1242 {
1243 struct ltt_ust_session *usess;
1244
1245 usess = session->ust_session;
1246
1247 ret = trace_ust_track_pid(usess, pid);
1248 if (ret != LTTNG_OK) {
1249 goto error;
1250 }
1251 break;
1252 }
ccf10263
MD
1253 default:
1254 ret = LTTNG_ERR_UNKNOWN_DOMAIN;
1255 goto error;
1256 }
1257
1258 ret = LTTNG_OK;
1259
1260error:
1261 rcu_read_unlock();
1262 return ret;
1263}
1264
1265/*
1266 * Command LTTNG_UNTRACK_PID processed by the client thread.
a9ad0c8f
MD
1267 *
1268 * Called with session lock held.
ccf10263 1269 */
56a37563
JG
1270int cmd_untrack_pid(struct ltt_session *session, enum lttng_domain_type domain,
1271 int pid)
ccf10263
MD
1272{
1273 int ret;
1274
1275 rcu_read_lock();
1276
1277 switch (domain) {
1278 case LTTNG_DOMAIN_KERNEL:
1279 {
1280 struct ltt_kernel_session *ksess;
1281
1282 ksess = session->kernel_session;
1283
1284 ret = kernel_untrack_pid(ksess, pid);
1285 if (ret != LTTNG_OK) {
1286 goto error;
1287 }
1288
1289 kernel_wait_quiescent(kernel_tracer_fd);
1290 break;
1291 }
ccf10263 1292 case LTTNG_DOMAIN_UST:
a9ad0c8f
MD
1293 {
1294 struct ltt_ust_session *usess;
1295
1296 usess = session->ust_session;
1297
1298 ret = trace_ust_untrack_pid(usess, pid);
1299 if (ret != LTTNG_OK) {
1300 goto error;
1301 }
1302 break;
1303 }
ccf10263
MD
1304 default:
1305 ret = LTTNG_ERR_UNKNOWN_DOMAIN;
1306 goto error;
1307 }
1308
1309 ret = LTTNG_OK;
1310
1311error:
1312 rcu_read_unlock();
1313 return ret;
1314}
1315
2f77fc4b
DG
1316/*
1317 * Command LTTNG_ENABLE_CHANNEL processed by the client thread.
1318 *
1319 * The wpipe arguments is used as a notifier for the kernel thread.
1320 */
1321int cmd_enable_channel(struct ltt_session *session,
7972aab2 1322 struct lttng_domain *domain, struct lttng_channel *attr, int wpipe)
2f77fc4b
DG
1323{
1324 int ret;
1325 struct ltt_ust_session *usess = session->ust_session;
1326 struct lttng_ht *chan_ht;
1f345e94 1327 size_t len;
2f77fc4b
DG
1328
1329 assert(session);
1330 assert(attr);
7972aab2 1331 assert(domain);
2f77fc4b 1332
f5436bfc 1333 len = lttng_strnlen(attr->name, sizeof(attr->name));
1f345e94
PP
1334
1335 /* Validate channel name */
1336 if (attr->name[0] == '.' ||
1337 memchr(attr->name, '/', len) != NULL) {
1338 ret = LTTNG_ERR_INVALID_CHANNEL_NAME;
1339 goto end;
1340 }
1341
2f77fc4b
DG
1342 DBG("Enabling channel %s for session %s", attr->name, session->name);
1343
03b4fdcf
DG
1344 rcu_read_lock();
1345
ecc48a90
JD
1346 /*
1347 * Don't try to enable a channel if the session has been started at
1348 * some point in time before. The tracer does not allow it.
1349 */
8382cf6f 1350 if (session->has_been_started) {
ecc48a90
JD
1351 ret = LTTNG_ERR_TRACE_ALREADY_STARTED;
1352 goto error;
1353 }
1354
1355 /*
1356 * If the session is a live session, remove the switch timer, the
1357 * live timer does the same thing but sends also synchronisation
1358 * beacons for inactive streams.
1359 */
1360 if (session->live_timer > 0) {
1361 attr->attr.live_timer_interval = session->live_timer;
1362 attr->attr.switch_timer_interval = 0;
1363 }
1364
6e21424e
JR
1365 /* Check for feature support */
1366 switch (domain->type) {
1367 case LTTNG_DOMAIN_KERNEL:
1368 {
1369 if (kernel_supports_ring_buffer_snapshot_sample_positions(kernel_tracer_fd) != 1) {
1370 /* Sampling position of buffer is not supported */
1371 WARN("Kernel tracer does not support buffer monitoring. "
1372 "Setting the monitor interval timer to 0 "
1373 "(disabled) for channel '%s' of session '%s'",
1374 attr-> name, session->name);
1375 lttng_channel_set_monitor_timer_interval(attr, 0);
1376 }
1377 break;
1378 }
1379 case LTTNG_DOMAIN_UST:
1380 case LTTNG_DOMAIN_JUL:
1381 case LTTNG_DOMAIN_LOG4J:
1382 case LTTNG_DOMAIN_PYTHON:
1383 break;
1384 default:
1385 ret = LTTNG_ERR_UNKNOWN_DOMAIN;
1386 goto error;
1387 }
1388
7972aab2 1389 switch (domain->type) {
2f77fc4b
DG
1390 case LTTNG_DOMAIN_KERNEL:
1391 {
1392 struct ltt_kernel_channel *kchan;
1393
2f77fc4b
DG
1394 kchan = trace_kernel_get_channel_by_name(attr->name,
1395 session->kernel_session);
1396 if (kchan == NULL) {
1397 ret = channel_kernel_create(session->kernel_session, attr, wpipe);
85076754
MD
1398 if (attr->name[0] != '\0') {
1399 session->kernel_session->has_non_default_channel = 1;
1400 }
2f77fc4b
DG
1401 } else {
1402 ret = channel_kernel_enable(session->kernel_session, kchan);
1403 }
1404
f73fabfd 1405 if (ret != LTTNG_OK) {
2f77fc4b
DG
1406 goto error;
1407 }
1408
784303b0 1409 kernel_wait_quiescent(kernel_tracer_fd);
2f77fc4b
DG
1410 break;
1411 }
1412 case LTTNG_DOMAIN_UST:
9232818f
JG
1413 case LTTNG_DOMAIN_JUL:
1414 case LTTNG_DOMAIN_LOG4J:
1415 case LTTNG_DOMAIN_PYTHON:
2f77fc4b
DG
1416 {
1417 struct ltt_ust_channel *uchan;
1418
9232818f
JG
1419 /*
1420 * FIXME
1421 *
1422 * Current agent implementation limitations force us to allow
1423 * only one channel at once in "agent" subdomains. Each
1424 * subdomain has a default channel name which must be strictly
1425 * adhered to.
1426 */
1427 if (domain->type == LTTNG_DOMAIN_JUL) {
1428 if (strncmp(attr->name, DEFAULT_JUL_CHANNEL_NAME,
1429 LTTNG_SYMBOL_NAME_LEN)) {
1430 ret = LTTNG_ERR_INVALID_CHANNEL_NAME;
1431 goto error;
1432 }
1433 } else if (domain->type == LTTNG_DOMAIN_LOG4J) {
1434 if (strncmp(attr->name, DEFAULT_LOG4J_CHANNEL_NAME,
1435 LTTNG_SYMBOL_NAME_LEN)) {
1436 ret = LTTNG_ERR_INVALID_CHANNEL_NAME;
1437 goto error;
1438 }
1439 } else if (domain->type == LTTNG_DOMAIN_PYTHON) {
1440 if (strncmp(attr->name, DEFAULT_PYTHON_CHANNEL_NAME,
1441 LTTNG_SYMBOL_NAME_LEN)) {
1442 ret = LTTNG_ERR_INVALID_CHANNEL_NAME;
1443 goto error;
1444 }
1445 }
1446
2f77fc4b
DG
1447 chan_ht = usess->domain_global.channels;
1448
1449 uchan = trace_ust_find_channel_by_name(chan_ht, attr->name);
1450 if (uchan == NULL) {
7972aab2 1451 ret = channel_ust_create(usess, attr, domain->buf_type);
85076754
MD
1452 if (attr->name[0] != '\0') {
1453 usess->has_non_default_channel = 1;
1454 }
2f77fc4b 1455 } else {
7972aab2 1456 ret = channel_ust_enable(usess, uchan);
2f77fc4b
DG
1457 }
1458 break;
1459 }
2f77fc4b 1460 default:
f73fabfd 1461 ret = LTTNG_ERR_UNKNOWN_DOMAIN;
2f77fc4b
DG
1462 goto error;
1463 }
1464
1465error:
2223c96f 1466 rcu_read_unlock();
1f345e94 1467end:
2f77fc4b
DG
1468 return ret;
1469}
1470
2f77fc4b
DG
1471/*
1472 * Command LTTNG_DISABLE_EVENT processed by the client thread.
1473 */
56a37563
JG
1474int cmd_disable_event(struct ltt_session *session,
1475 enum lttng_domain_type domain, char *channel_name,
6e911cad 1476 struct lttng_event *event)
2f77fc4b
DG
1477{
1478 int ret;
6e911cad
MD
1479 char *event_name;
1480
18a720cd
MD
1481 DBG("Disable event command for event \'%s\'", event->name);
1482
6e911cad
MD
1483 event_name = event->name;
1484
9b7431cf
JG
1485 /* Error out on unhandled search criteria */
1486 if (event->loglevel_type || event->loglevel != -1 || event->enabled
6e911cad 1487 || event->pid || event->filter || event->exclusion) {
7076b56e
JG
1488 ret = LTTNG_ERR_UNK;
1489 goto error;
6e911cad 1490 }
2f77fc4b 1491
2223c96f
DG
1492 rcu_read_lock();
1493
2f77fc4b
DG
1494 switch (domain) {
1495 case LTTNG_DOMAIN_KERNEL:
1496 {
1497 struct ltt_kernel_channel *kchan;
1498 struct ltt_kernel_session *ksess;
1499
1500 ksess = session->kernel_session;
1501
85076754
MD
1502 /*
1503 * If a non-default channel has been created in the
1504 * session, explicitely require that -c chan_name needs
1505 * to be provided.
1506 */
1507 if (ksess->has_non_default_channel && channel_name[0] == '\0') {
1508 ret = LTTNG_ERR_NEED_CHANNEL_NAME;
7076b56e 1509 goto error_unlock;
85076754
MD
1510 }
1511
2f77fc4b
DG
1512 kchan = trace_kernel_get_channel_by_name(channel_name, ksess);
1513 if (kchan == NULL) {
f73fabfd 1514 ret = LTTNG_ERR_KERN_CHAN_NOT_FOUND;
7076b56e 1515 goto error_unlock;
2f77fc4b
DG
1516 }
1517
6e911cad
MD
1518 switch (event->type) {
1519 case LTTNG_EVENT_ALL:
9550ee81 1520 case LTTNG_EVENT_TRACEPOINT:
d0ae4ea8 1521 case LTTNG_EVENT_SYSCALL:
9550ee81
JR
1522 case LTTNG_EVENT_PROBE:
1523 case LTTNG_EVENT_FUNCTION:
1524 case LTTNG_EVENT_FUNCTION_ENTRY:/* fall-through */
1525 if (event_name[0] == '\0') {
1526 ret = event_kernel_disable_event(kchan,
1527 NULL, event->type);
29c62722 1528 } else {
d0ae4ea8 1529 ret = event_kernel_disable_event(kchan,
9550ee81 1530 event_name, event->type);
29c62722 1531 }
6e911cad 1532 if (ret != LTTNG_OK) {
7076b56e 1533 goto error_unlock;
6e911cad
MD
1534 }
1535 break;
6e911cad
MD
1536 default:
1537 ret = LTTNG_ERR_UNK;
7076b56e 1538 goto error_unlock;
2f77fc4b
DG
1539 }
1540
1541 kernel_wait_quiescent(kernel_tracer_fd);
1542 break;
1543 }
1544 case LTTNG_DOMAIN_UST:
1545 {
1546 struct ltt_ust_channel *uchan;
1547 struct ltt_ust_session *usess;
1548
1549 usess = session->ust_session;
1550
7076b56e
JG
1551 if (validate_ust_event_name(event_name)) {
1552 ret = LTTNG_ERR_INVALID_EVENT_NAME;
1553 goto error_unlock;
1554 }
1555
85076754
MD
1556 /*
1557 * If a non-default channel has been created in the
9550ee81 1558 * session, explicitly require that -c chan_name needs
85076754
MD
1559 * to be provided.
1560 */
1561 if (usess->has_non_default_channel && channel_name[0] == '\0') {
1562 ret = LTTNG_ERR_NEED_CHANNEL_NAME;
7076b56e 1563 goto error_unlock;
85076754
MD
1564 }
1565
2f77fc4b
DG
1566 uchan = trace_ust_find_channel_by_name(usess->domain_global.channels,
1567 channel_name);
1568 if (uchan == NULL) {
f73fabfd 1569 ret = LTTNG_ERR_UST_CHAN_NOT_FOUND;
7076b56e 1570 goto error_unlock;
2f77fc4b
DG
1571 }
1572
6e911cad
MD
1573 switch (event->type) {
1574 case LTTNG_EVENT_ALL:
b3639870
JR
1575 /*
1576 * An empty event name means that everything
1577 * should be disabled.
1578 */
1579 if (event->name[0] == '\0') {
1580 ret = event_ust_disable_all_tracepoints(usess, uchan);
77d536b2
JR
1581 } else {
1582 ret = event_ust_disable_tracepoint(usess, uchan,
1583 event_name);
1584 }
6e911cad 1585 if (ret != LTTNG_OK) {
7076b56e 1586 goto error_unlock;
6e911cad
MD
1587 }
1588 break;
1589 default:
1590 ret = LTTNG_ERR_UNK;
7076b56e 1591 goto error_unlock;
2f77fc4b
DG
1592 }
1593
1594 DBG3("Disable UST event %s in channel %s completed", event_name,
1595 channel_name);
1596 break;
1597 }
5cdb6027 1598 case LTTNG_DOMAIN_LOG4J:
f20baf8e 1599 case LTTNG_DOMAIN_JUL:
0e115563 1600 case LTTNG_DOMAIN_PYTHON:
f20baf8e 1601 {
fefd409b 1602 struct agent *agt;
f20baf8e
DG
1603 struct ltt_ust_session *usess = session->ust_session;
1604
1605 assert(usess);
1606
6e911cad
MD
1607 switch (event->type) {
1608 case LTTNG_EVENT_ALL:
1609 break;
1610 default:
1611 ret = LTTNG_ERR_UNK;
7076b56e 1612 goto error_unlock;
6e911cad
MD
1613 }
1614
5cdb6027 1615 agt = trace_ust_find_agent(usess, domain);
fefd409b
DG
1616 if (!agt) {
1617 ret = -LTTNG_ERR_UST_EVENT_NOT_FOUND;
7076b56e 1618 goto error_unlock;
fefd409b 1619 }
b3639870
JR
1620 /*
1621 * An empty event name means that everything
1622 * should be disabled.
1623 */
1624 if (event->name[0] == '\0') {
18a720cd
MD
1625 ret = event_agent_disable_all(usess, agt);
1626 } else {
1627 ret = event_agent_disable(usess, agt, event_name);
1628 }
f20baf8e 1629 if (ret != LTTNG_OK) {
7076b56e 1630 goto error_unlock;
f20baf8e
DG
1631 }
1632
1633 break;
1634 }
2f77fc4b 1635 default:
f73fabfd 1636 ret = LTTNG_ERR_UND;
7076b56e 1637 goto error_unlock;
2f77fc4b
DG
1638 }
1639
f73fabfd 1640 ret = LTTNG_OK;
2f77fc4b 1641
7076b56e 1642error_unlock:
2223c96f 1643 rcu_read_unlock();
7076b56e 1644error:
2f77fc4b
DG
1645 return ret;
1646}
1647
2f77fc4b
DG
1648/*
1649 * Command LTTNG_ADD_CONTEXT processed by the client thread.
1650 */
56a37563 1651int cmd_add_context(struct ltt_session *session, enum lttng_domain_type domain,
601d5acf 1652 char *channel_name, struct lttng_event_context *ctx, int kwpipe)
2f77fc4b 1653{
d5979e4a 1654 int ret, chan_kern_created = 0, chan_ust_created = 0;
bdf64013
JG
1655 char *app_ctx_provider_name = NULL, *app_ctx_name = NULL;
1656
9a699f7b
JR
1657 /*
1658 * Don't try to add a context if the session has been started at
1659 * some point in time before. The tracer does not allow it and would
1660 * result in a corrupted trace.
1661 */
1662 if (session->has_been_started) {
1663 ret = LTTNG_ERR_TRACE_ALREADY_STARTED;
1664 goto end;
1665 }
1666
bdf64013
JG
1667 if (ctx->ctx == LTTNG_EVENT_CONTEXT_APP_CONTEXT) {
1668 app_ctx_provider_name = ctx->u.app_ctx.provider_name;
1669 app_ctx_name = ctx->u.app_ctx.ctx_name;
1670 }
2f77fc4b
DG
1671
1672 switch (domain) {
1673 case LTTNG_DOMAIN_KERNEL:
979e618e
DG
1674 assert(session->kernel_session);
1675
1676 if (session->kernel_session->channel_count == 0) {
1677 /* Create default channel */
1678 ret = channel_kernel_create(session->kernel_session, NULL, kwpipe);
1679 if (ret != LTTNG_OK) {
1680 goto error;
1681 }
d5979e4a 1682 chan_kern_created = 1;
979e618e 1683 }
2f77fc4b 1684 /* Add kernel context to kernel tracer */
601d5acf 1685 ret = context_kernel_add(session->kernel_session, ctx, channel_name);
f73fabfd 1686 if (ret != LTTNG_OK) {
2f77fc4b
DG
1687 goto error;
1688 }
1689 break;
bdf64013
JG
1690 case LTTNG_DOMAIN_JUL:
1691 case LTTNG_DOMAIN_LOG4J:
1692 {
1693 /*
1694 * Validate channel name.
1695 * If no channel name is given and the domain is JUL or LOG4J,
1696 * set it to the appropriate domain-specific channel name. If
1697 * a name is provided but does not match the expexted channel
1698 * name, return an error.
1699 */
1700 if (domain == LTTNG_DOMAIN_JUL && *channel_name &&
1701 strcmp(channel_name,
1702 DEFAULT_JUL_CHANNEL_NAME)) {
1703 ret = LTTNG_ERR_UST_CHAN_NOT_FOUND;
1704 goto error;
1705 } else if (domain == LTTNG_DOMAIN_LOG4J && *channel_name &&
1706 strcmp(channel_name,
1707 DEFAULT_LOG4J_CHANNEL_NAME)) {
1708 ret = LTTNG_ERR_UST_CHAN_NOT_FOUND;
1709 goto error;
1710 }
a93b3916 1711 /* break is _not_ missing here. */
bdf64013 1712 }
2f77fc4b
DG
1713 case LTTNG_DOMAIN_UST:
1714 {
1715 struct ltt_ust_session *usess = session->ust_session;
85076754
MD
1716 unsigned int chan_count;
1717
2f77fc4b
DG
1718 assert(usess);
1719
85076754 1720 chan_count = lttng_ht_get_count(usess->domain_global.channels);
979e618e
DG
1721 if (chan_count == 0) {
1722 struct lttng_channel *attr;
1723 /* Create default channel */
0a9c6494 1724 attr = channel_new_default_attr(domain, usess->buffer_type);
979e618e
DG
1725 if (attr == NULL) {
1726 ret = LTTNG_ERR_FATAL;
1727 goto error;
1728 }
1729
7972aab2 1730 ret = channel_ust_create(usess, attr, usess->buffer_type);
979e618e
DG
1731 if (ret != LTTNG_OK) {
1732 free(attr);
1733 goto error;
1734 }
cf0bcb51 1735 channel_attr_destroy(attr);
d5979e4a 1736 chan_ust_created = 1;
979e618e
DG
1737 }
1738
601d5acf 1739 ret = context_ust_add(usess, domain, ctx, channel_name);
bdf64013
JG
1740 free(app_ctx_provider_name);
1741 free(app_ctx_name);
1742 app_ctx_name = NULL;
1743 app_ctx_provider_name = NULL;
f73fabfd 1744 if (ret != LTTNG_OK) {
2f77fc4b
DG
1745 goto error;
1746 }
1747 break;
1748 }
2f77fc4b 1749 default:
f73fabfd 1750 ret = LTTNG_ERR_UND;
2f77fc4b
DG
1751 goto error;
1752 }
1753
bdf64013
JG
1754 ret = LTTNG_OK;
1755 goto end;
2f77fc4b
DG
1756
1757error:
d5979e4a
DG
1758 if (chan_kern_created) {
1759 struct ltt_kernel_channel *kchan =
1760 trace_kernel_get_channel_by_name(DEFAULT_CHANNEL_NAME,
1761 session->kernel_session);
1762 /* Created previously, this should NOT fail. */
1763 assert(kchan);
1764 kernel_destroy_channel(kchan);
1765 }
1766
1767 if (chan_ust_created) {
1768 struct ltt_ust_channel *uchan =
1769 trace_ust_find_channel_by_name(
1770 session->ust_session->domain_global.channels,
1771 DEFAULT_CHANNEL_NAME);
1772 /* Created previously, this should NOT fail. */
1773 assert(uchan);
1774 /* Remove from the channel list of the session. */
1775 trace_ust_delete_channel(session->ust_session->domain_global.channels,
1776 uchan);
1777 trace_ust_destroy_channel(uchan);
1778 }
bdf64013
JG
1779end:
1780 free(app_ctx_provider_name);
1781 free(app_ctx_name);
2f77fc4b
DG
1782 return ret;
1783}
1784
dac8e046
JG
1785static inline bool name_starts_with(const char *name, const char *prefix)
1786{
1787 const size_t max_cmp_len = min(strlen(prefix), LTTNG_SYMBOL_NAME_LEN);
1788
1789 return !strncmp(name, prefix, max_cmp_len);
1790}
1791
1792/* Perform userspace-specific event name validation */
1793static int validate_ust_event_name(const char *name)
1794{
1795 int ret = 0;
1796
1797 if (!name) {
1798 ret = -1;
1799 goto end;
1800 }
1801
1802 /*
1803 * Check name against all internal UST event component namespaces used
1804 * by the agents.
1805 */
1806 if (name_starts_with(name, DEFAULT_JUL_EVENT_COMPONENT) ||
1807 name_starts_with(name, DEFAULT_LOG4J_EVENT_COMPONENT) ||
1808 name_starts_with(name, DEFAULT_PYTHON_EVENT_COMPONENT)) {
1809 ret = -1;
1810 }
1811
1812end:
1813 return ret;
1814}
88f06f15 1815
2f77fc4b 1816/*
88f06f15
JG
1817 * Internal version of cmd_enable_event() with a supplemental
1818 * "internal_event" flag which is used to enable internal events which should
1819 * be hidden from clients. Such events are used in the agent implementation to
1820 * enable the events through which all "agent" events are funeled.
2f77fc4b 1821 */
88f06f15
JG
1822static int _cmd_enable_event(struct ltt_session *session,
1823 struct lttng_domain *domain,
025faf73 1824 char *channel_name, struct lttng_event *event,
6b453b5e 1825 char *filter_expression,
db8f1377
JI
1826 struct lttng_filter_bytecode *filter,
1827 struct lttng_event_exclusion *exclusion,
88f06f15 1828 int wpipe, bool internal_event)
2f77fc4b 1829{
9f449915 1830 int ret = 0, channel_created = 0;
cfedea03 1831 struct lttng_channel *attr = NULL;
2f77fc4b
DG
1832
1833 assert(session);
1834 assert(event);
1835 assert(channel_name);
1836
2a385866
JG
1837 /* If we have a filter, we must have its filter expression */
1838 assert(!(!!filter_expression ^ !!filter));
1839
9f449915
PP
1840 /* Normalize event name as a globbing pattern */
1841 strutils_normalize_star_glob_pattern(event->name);
18a720cd 1842
9f449915
PP
1843 /* Normalize exclusion names as globbing patterns */
1844 if (exclusion) {
1845 size_t i;
f5ac4bd7 1846
9f449915
PP
1847 for (i = 0; i < exclusion->count; i++) {
1848 char *name = LTTNG_EVENT_EXCLUSION_NAME_AT(exclusion, i);
1849
1850 strutils_normalize_star_glob_pattern(name);
1851 }
930a2e99
JG
1852 }
1853
9f449915
PP
1854 DBG("Enable event command for event \'%s\'", event->name);
1855
1856 rcu_read_lock();
1857
7972aab2 1858 switch (domain->type) {
2f77fc4b
DG
1859 case LTTNG_DOMAIN_KERNEL:
1860 {
1861 struct ltt_kernel_channel *kchan;
1862
85076754
MD
1863 /*
1864 * If a non-default channel has been created in the
1865 * session, explicitely require that -c chan_name needs
1866 * to be provided.
1867 */
1868 if (session->kernel_session->has_non_default_channel
1869 && channel_name[0] == '\0') {
1870 ret = LTTNG_ERR_NEED_CHANNEL_NAME;
1871 goto error;
1872 }
1873
2f77fc4b
DG
1874 kchan = trace_kernel_get_channel_by_name(channel_name,
1875 session->kernel_session);
1876 if (kchan == NULL) {
0a9c6494
DG
1877 attr = channel_new_default_attr(LTTNG_DOMAIN_KERNEL,
1878 LTTNG_BUFFER_GLOBAL);
2f77fc4b 1879 if (attr == NULL) {
f73fabfd 1880 ret = LTTNG_ERR_FATAL;
2f77fc4b
DG
1881 goto error;
1882 }
04c17253
MD
1883 if (lttng_strncpy(attr->name, channel_name,
1884 sizeof(attr->name))) {
1885 ret = LTTNG_ERR_INVALID;
04c17253
MD
1886 goto error;
1887 }
2f77fc4b
DG
1888
1889 ret = cmd_enable_channel(session, domain, attr, wpipe);
f73fabfd 1890 if (ret != LTTNG_OK) {
2f77fc4b
DG
1891 goto error;
1892 }
e5f5db7f 1893 channel_created = 1;
2f77fc4b
DG
1894 }
1895
1896 /* Get the newly created kernel channel pointer */
1897 kchan = trace_kernel_get_channel_by_name(channel_name,
1898 session->kernel_session);
1899 if (kchan == NULL) {
1900 /* This sould not happen... */
f73fabfd 1901 ret = LTTNG_ERR_FATAL;
2f77fc4b
DG
1902 goto error;
1903 }
1904
6e911cad
MD
1905 switch (event->type) {
1906 case LTTNG_EVENT_ALL:
29c62722 1907 {
00a62084
MD
1908 char *filter_expression_a = NULL;
1909 struct lttng_filter_bytecode *filter_a = NULL;
1910
1911 /*
1912 * We need to duplicate filter_expression and filter,
1913 * because ownership is passed to first enable
1914 * event.
1915 */
1916 if (filter_expression) {
1917 filter_expression_a = strdup(filter_expression);
1918 if (!filter_expression_a) {
1919 ret = LTTNG_ERR_FATAL;
1920 goto error;
1921 }
1922 }
1923 if (filter) {
1924 filter_a = zmalloc(sizeof(*filter_a) + filter->len);
1925 if (!filter_a) {
1926 free(filter_expression_a);
1927 ret = LTTNG_ERR_FATAL;
1928 goto error;
1929 }
1930 memcpy(filter_a, filter, sizeof(*filter_a) + filter->len);
1931 }
29c62722 1932 event->type = LTTNG_EVENT_TRACEPOINT; /* Hack */
00a62084
MD
1933 ret = event_kernel_enable_event(kchan, event,
1934 filter_expression, filter);
a969e101
MD
1935 /* We have passed ownership */
1936 filter_expression = NULL;
1937 filter = NULL;
29c62722
MD
1938 if (ret != LTTNG_OK) {
1939 if (channel_created) {
1940 /* Let's not leak a useless channel. */
1941 kernel_destroy_channel(kchan);
1942 }
00a62084
MD
1943 free(filter_expression_a);
1944 free(filter_a);
29c62722
MD
1945 goto error;
1946 }
1947 event->type = LTTNG_EVENT_SYSCALL; /* Hack */
00a62084
MD
1948 ret = event_kernel_enable_event(kchan, event,
1949 filter_expression_a, filter_a);
60d21fa2
AB
1950 /* We have passed ownership */
1951 filter_expression_a = NULL;
1952 filter_a = NULL;
29c62722
MD
1953 if (ret != LTTNG_OK) {
1954 goto error;
1955 }
1956 break;
1957 }
6e6ef3d7
DG
1958 case LTTNG_EVENT_PROBE:
1959 case LTTNG_EVENT_FUNCTION:
1960 case LTTNG_EVENT_FUNCTION_ENTRY:
6e911cad 1961 case LTTNG_EVENT_TRACEPOINT:
00a62084
MD
1962 ret = event_kernel_enable_event(kchan, event,
1963 filter_expression, filter);
a969e101
MD
1964 /* We have passed ownership */
1965 filter_expression = NULL;
1966 filter = NULL;
6e911cad
MD
1967 if (ret != LTTNG_OK) {
1968 if (channel_created) {
1969 /* Let's not leak a useless channel. */
1970 kernel_destroy_channel(kchan);
1971 }
1972 goto error;
e5f5db7f 1973 }
6e911cad
MD
1974 break;
1975 case LTTNG_EVENT_SYSCALL:
00a62084
MD
1976 ret = event_kernel_enable_event(kchan, event,
1977 filter_expression, filter);
a969e101
MD
1978 /* We have passed ownership */
1979 filter_expression = NULL;
1980 filter = NULL;
e2b957af
MD
1981 if (ret != LTTNG_OK) {
1982 goto error;
1983 }
6e911cad
MD
1984 break;
1985 default:
1986 ret = LTTNG_ERR_UNK;
2f77fc4b
DG
1987 goto error;
1988 }
1989
1990 kernel_wait_quiescent(kernel_tracer_fd);
1991 break;
1992 }
1993 case LTTNG_DOMAIN_UST:
1994 {
1995 struct ltt_ust_channel *uchan;
1996 struct ltt_ust_session *usess = session->ust_session;
1997
1998 assert(usess);
1999
85076754
MD
2000 /*
2001 * If a non-default channel has been created in the
2002 * session, explicitely require that -c chan_name needs
2003 * to be provided.
2004 */
2005 if (usess->has_non_default_channel && channel_name[0] == '\0') {
2006 ret = LTTNG_ERR_NEED_CHANNEL_NAME;
2007 goto error;
2008 }
2009
2f77fc4b
DG
2010 /* Get channel from global UST domain */
2011 uchan = trace_ust_find_channel_by_name(usess->domain_global.channels,
2012 channel_name);
2013 if (uchan == NULL) {
2014 /* Create default channel */
0a9c6494
DG
2015 attr = channel_new_default_attr(LTTNG_DOMAIN_UST,
2016 usess->buffer_type);
2f77fc4b 2017 if (attr == NULL) {
f73fabfd 2018 ret = LTTNG_ERR_FATAL;
2f77fc4b
DG
2019 goto error;
2020 }
04c17253
MD
2021 if (lttng_strncpy(attr->name, channel_name,
2022 sizeof(attr->name))) {
2023 ret = LTTNG_ERR_INVALID;
04c17253
MD
2024 goto error;
2025 }
2f77fc4b
DG
2026
2027 ret = cmd_enable_channel(session, domain, attr, wpipe);
f73fabfd 2028 if (ret != LTTNG_OK) {
2f77fc4b
DG
2029 goto error;
2030 }
2f77fc4b
DG
2031
2032 /* Get the newly created channel reference back */
2033 uchan = trace_ust_find_channel_by_name(
2034 usess->domain_global.channels, channel_name);
2035 assert(uchan);
2036 }
2037
141feb8c
JG
2038 if (uchan->domain != LTTNG_DOMAIN_UST && !internal_event) {
2039 /*
2040 * Don't allow users to add UST events to channels which
2041 * are assigned to a userspace subdomain (JUL, Log4J,
2042 * Python, etc.).
2043 */
2044 ret = LTTNG_ERR_INVALID_CHANNEL_DOMAIN;
2045 goto error;
2046 }
2047
dac8e046
JG
2048 if (!internal_event) {
2049 /*
2050 * Ensure the event name is not reserved for internal
2051 * use.
2052 */
2053 ret = validate_ust_event_name(event->name);
2054 if (ret) {
2055 WARN("Userspace event name %s failed validation.",
2056 event->name ?
2057 event->name : "NULL");
2058 ret = LTTNG_ERR_INVALID_EVENT_NAME;
2059 goto error;
2060 }
2061 }
2062
2f77fc4b 2063 /* At this point, the session and channel exist on the tracer */
6b453b5e 2064 ret = event_ust_enable_tracepoint(usess, uchan, event,
88f06f15
JG
2065 filter_expression, filter, exclusion,
2066 internal_event);
49d21f93
MD
2067 /* We have passed ownership */
2068 filter_expression = NULL;
2069 filter = NULL;
2070 exclusion = NULL;
94382e15
JG
2071 if (ret == LTTNG_ERR_UST_EVENT_ENABLED) {
2072 goto already_enabled;
2073 } else if (ret != LTTNG_OK) {
2f77fc4b
DG
2074 goto error;
2075 }
2076 break;
2077 }
5cdb6027 2078 case LTTNG_DOMAIN_LOG4J:
f20baf8e 2079 case LTTNG_DOMAIN_JUL:
0e115563 2080 case LTTNG_DOMAIN_PYTHON:
f20baf8e 2081 {
da6c3a50 2082 const char *default_event_name, *default_chan_name;
fefd409b 2083 struct agent *agt;
f20baf8e
DG
2084 struct lttng_event uevent;
2085 struct lttng_domain tmp_dom;
2086 struct ltt_ust_session *usess = session->ust_session;
2087
2088 assert(usess);
2089
5cdb6027 2090 agt = trace_ust_find_agent(usess, domain->type);
fefd409b 2091 if (!agt) {
5cdb6027 2092 agt = agent_create(domain->type);
fefd409b 2093 if (!agt) {
e5b3c48c 2094 ret = LTTNG_ERR_NOMEM;
fefd409b
DG
2095 goto error;
2096 }
2097 agent_add(agt, usess->agents);
2098 }
2099
022d91ba 2100 /* Create the default tracepoint. */
996de3c7 2101 memset(&uevent, 0, sizeof(uevent));
f20baf8e
DG
2102 uevent.type = LTTNG_EVENT_TRACEPOINT;
2103 uevent.loglevel_type = LTTNG_EVENT_LOGLEVEL_ALL;
51755dc8
JG
2104 default_event_name = event_get_default_agent_ust_name(
2105 domain->type);
da6c3a50 2106 if (!default_event_name) {
e5b3c48c 2107 ret = LTTNG_ERR_FATAL;
da6c3a50 2108 goto error;
f43f95a9 2109 }
da6c3a50 2110 strncpy(uevent.name, default_event_name, sizeof(uevent.name));
f20baf8e
DG
2111 uevent.name[sizeof(uevent.name) - 1] = '\0';
2112
2113 /*
2114 * The domain type is changed because we are about to enable the
2115 * default channel and event for the JUL domain that are hardcoded.
2116 * This happens in the UST domain.
2117 */
2118 memcpy(&tmp_dom, domain, sizeof(tmp_dom));
2119 tmp_dom.type = LTTNG_DOMAIN_UST;
2120
0e115563
DG
2121 switch (domain->type) {
2122 case LTTNG_DOMAIN_LOG4J:
da6c3a50 2123 default_chan_name = DEFAULT_LOG4J_CHANNEL_NAME;
0e115563
DG
2124 break;
2125 case LTTNG_DOMAIN_JUL:
da6c3a50 2126 default_chan_name = DEFAULT_JUL_CHANNEL_NAME;
0e115563
DG
2127 break;
2128 case LTTNG_DOMAIN_PYTHON:
2129 default_chan_name = DEFAULT_PYTHON_CHANNEL_NAME;
2130 break;
2131 default:
e98a44b0 2132 /* The switch/case we are in makes this impossible */
0e115563 2133 assert(0);
da6c3a50
DG
2134 }
2135
971da06a 2136 {
8404118c 2137 char *filter_expression_copy = NULL;
51755dc8 2138 struct lttng_filter_bytecode *filter_copy = NULL;
971da06a
JG
2139
2140 if (filter) {
51755dc8
JG
2141 const size_t filter_size = sizeof(
2142 struct lttng_filter_bytecode)
2143 + filter->len;
2144
2145 filter_copy = zmalloc(filter_size);
971da06a 2146 if (!filter_copy) {
018096a4 2147 ret = LTTNG_ERR_NOMEM;
b742e3e2 2148 goto error;
971da06a 2149 }
51755dc8 2150 memcpy(filter_copy, filter, filter_size);
971da06a 2151
8404118c
JG
2152 filter_expression_copy =
2153 strdup(filter_expression);
2154 if (!filter_expression) {
2155 ret = LTTNG_ERR_NOMEM;
51755dc8
JG
2156 }
2157
2158 if (!filter_expression_copy || !filter_copy) {
2159 free(filter_expression_copy);
2160 free(filter_copy);
2161 goto error;
8404118c 2162 }
971da06a
JG
2163 }
2164
88f06f15 2165 ret = cmd_enable_event_internal(session, &tmp_dom,
971da06a 2166 (char *) default_chan_name,
8404118c
JG
2167 &uevent, filter_expression_copy,
2168 filter_copy, NULL, wpipe);
971da06a
JG
2169 }
2170
94382e15
JG
2171 if (ret == LTTNG_ERR_UST_EVENT_ENABLED) {
2172 goto already_enabled;
2173 } else if (ret != LTTNG_OK) {
f20baf8e
DG
2174 goto error;
2175 }
2176
2177 /* The wild card * means that everything should be enabled. */
2178 if (strncmp(event->name, "*", 1) == 0 && strlen(event->name) == 1) {
8404118c
JG
2179 ret = event_agent_enable_all(usess, agt, event, filter,
2180 filter_expression);
f20baf8e 2181 } else {
8404118c
JG
2182 ret = event_agent_enable(usess, agt, event, filter,
2183 filter_expression);
f20baf8e 2184 }
51755dc8
JG
2185 filter = NULL;
2186 filter_expression = NULL;
f20baf8e
DG
2187 if (ret != LTTNG_OK) {
2188 goto error;
2189 }
2190
2191 break;
2192 }
2f77fc4b 2193 default:
f73fabfd 2194 ret = LTTNG_ERR_UND;
2f77fc4b
DG
2195 goto error;
2196 }
2197
f73fabfd 2198 ret = LTTNG_OK;
2f77fc4b 2199
94382e15 2200already_enabled:
2f77fc4b 2201error:
49d21f93
MD
2202 free(filter_expression);
2203 free(filter);
2204 free(exclusion);
cf0bcb51 2205 channel_attr_destroy(attr);
2223c96f 2206 rcu_read_unlock();
2f77fc4b
DG
2207 return ret;
2208}
2209
88f06f15
JG
2210/*
2211 * Command LTTNG_ENABLE_EVENT processed by the client thread.
2212 * We own filter, exclusion, and filter_expression.
2213 */
2214int cmd_enable_event(struct ltt_session *session, struct lttng_domain *domain,
2215 char *channel_name, struct lttng_event *event,
2216 char *filter_expression,
2217 struct lttng_filter_bytecode *filter,
2218 struct lttng_event_exclusion *exclusion,
2219 int wpipe)
2220{
2221 return _cmd_enable_event(session, domain, channel_name, event,
2222 filter_expression, filter, exclusion, wpipe, false);
2223}
2224
2225/*
2226 * Enable an event which is internal to LTTng. An internal should
2227 * never be made visible to clients and are immune to checks such as
2228 * reserved names.
2229 */
2230static int cmd_enable_event_internal(struct ltt_session *session,
2231 struct lttng_domain *domain,
2232 char *channel_name, struct lttng_event *event,
2233 char *filter_expression,
2234 struct lttng_filter_bytecode *filter,
2235 struct lttng_event_exclusion *exclusion,
2236 int wpipe)
2237{
2238 return _cmd_enable_event(session, domain, channel_name, event,
2239 filter_expression, filter, exclusion, wpipe, true);
2240}
2241
2f77fc4b
DG
2242/*
2243 * Command LTTNG_LIST_TRACEPOINTS processed by the client thread.
2244 */
56a37563
JG
2245ssize_t cmd_list_tracepoints(enum lttng_domain_type domain,
2246 struct lttng_event **events)
2f77fc4b
DG
2247{
2248 int ret;
2249 ssize_t nb_events = 0;
2250
2251 switch (domain) {
2252 case LTTNG_DOMAIN_KERNEL:
2253 nb_events = kernel_list_events(kernel_tracer_fd, events);
2254 if (nb_events < 0) {
f73fabfd 2255 ret = LTTNG_ERR_KERN_LIST_FAIL;
2f77fc4b
DG
2256 goto error;
2257 }
2258 break;
2259 case LTTNG_DOMAIN_UST:
2260 nb_events = ust_app_list_events(events);
2261 if (nb_events < 0) {
f73fabfd 2262 ret = LTTNG_ERR_UST_LIST_FAIL;
2f77fc4b
DG
2263 goto error;
2264 }
2265 break;
5cdb6027 2266 case LTTNG_DOMAIN_LOG4J:
3c6a091f 2267 case LTTNG_DOMAIN_JUL:
0e115563 2268 case LTTNG_DOMAIN_PYTHON:
f60140a1 2269 nb_events = agent_list_events(events, domain);
3c6a091f
DG
2270 if (nb_events < 0) {
2271 ret = LTTNG_ERR_UST_LIST_FAIL;
2272 goto error;
2273 }
2274 break;
2f77fc4b 2275 default:
f73fabfd 2276 ret = LTTNG_ERR_UND;
2f77fc4b
DG
2277 goto error;
2278 }
2279
2280 return nb_events;
2281
2282error:
2283 /* Return negative value to differentiate return code */
2284 return -ret;
2285}
2286
2287/*
2288 * Command LTTNG_LIST_TRACEPOINT_FIELDS processed by the client thread.
2289 */
56a37563 2290ssize_t cmd_list_tracepoint_fields(enum lttng_domain_type domain,
2f77fc4b
DG
2291 struct lttng_event_field **fields)
2292{
2293 int ret;
2294 ssize_t nb_fields = 0;
2295
2296 switch (domain) {
2297 case LTTNG_DOMAIN_UST:
2298 nb_fields = ust_app_list_event_fields(fields);
2299 if (nb_fields < 0) {
f73fabfd 2300 ret = LTTNG_ERR_UST_LIST_FAIL;
2f77fc4b
DG
2301 goto error;
2302 }
2303 break;
2304 case LTTNG_DOMAIN_KERNEL:
2305 default: /* fall-through */
f73fabfd 2306 ret = LTTNG_ERR_UND;
2f77fc4b
DG
2307 goto error;
2308 }
2309
2310 return nb_fields;
2311
2312error:
2313 /* Return negative value to differentiate return code */
2314 return -ret;
2315}
2316
834978fd
DG
2317ssize_t cmd_list_syscalls(struct lttng_event **events)
2318{
2319 return syscall_table_list(events);
2320}
2321
a5dfbb9d
MD
2322/*
2323 * Command LTTNG_LIST_TRACKER_PIDS processed by the client thread.
2324 *
2325 * Called with session lock held.
2326 */
2327ssize_t cmd_list_tracker_pids(struct ltt_session *session,
56a37563 2328 enum lttng_domain_type domain, int32_t **pids)
a5dfbb9d
MD
2329{
2330 int ret;
2331 ssize_t nr_pids = 0;
2332
2333 switch (domain) {
2334 case LTTNG_DOMAIN_KERNEL:
2335 {
2336 struct ltt_kernel_session *ksess;
2337
2338 ksess = session->kernel_session;
2339 nr_pids = kernel_list_tracker_pids(ksess, pids);
2340 if (nr_pids < 0) {
2341 ret = LTTNG_ERR_KERN_LIST_FAIL;
2342 goto error;
2343 }
2344 break;
2345 }
2346 case LTTNG_DOMAIN_UST:
2347 {
2348 struct ltt_ust_session *usess;
2349
2350 usess = session->ust_session;
2351 nr_pids = trace_ust_list_tracker_pids(usess, pids);
2352 if (nr_pids < 0) {
2353 ret = LTTNG_ERR_UST_LIST_FAIL;
2354 goto error;
2355 }
2356 break;
2357 }
2358 case LTTNG_DOMAIN_LOG4J:
2359 case LTTNG_DOMAIN_JUL:
2360 case LTTNG_DOMAIN_PYTHON:
2361 default:
2362 ret = LTTNG_ERR_UND;
2363 goto error;
2364 }
2365
2366 return nr_pids;
2367
2368error:
2369 /* Return negative value to differentiate return code */
2370 return -ret;
2371}
2372
2f77fc4b
DG
2373/*
2374 * Command LTTNG_START_TRACE processed by the client thread.
a9ad0c8f
MD
2375 *
2376 * Called with session mutex held.
2f77fc4b
DG
2377 */
2378int cmd_start_trace(struct ltt_session *session)
2379{
2380 int ret;
cde3e505 2381 unsigned long nb_chan = 0;
2f77fc4b
DG
2382 struct ltt_kernel_session *ksession;
2383 struct ltt_ust_session *usess;
2f77fc4b
DG
2384
2385 assert(session);
2386
2387 /* Ease our life a bit ;) */
2388 ksession = session->kernel_session;
2389 usess = session->ust_session;
2390
8382cf6f
DG
2391 /* Is the session already started? */
2392 if (session->active) {
f73fabfd 2393 ret = LTTNG_ERR_TRACE_ALREADY_STARTED;
2f77fc4b
DG
2394 goto error;
2395 }
2396
cde3e505
DG
2397 /*
2398 * Starting a session without channel is useless since after that it's not
2399 * possible to enable channel thus inform the client.
2400 */
2401 if (usess && usess->domain_global.channels) {
2402 nb_chan += lttng_ht_get_count(usess->domain_global.channels);
2403 }
2404 if (ksession) {
2405 nb_chan += ksession->channel_count;
2406 }
2407 if (!nb_chan) {
2408 ret = LTTNG_ERR_NO_CHANNEL;
2409 goto error;
2410 }
2411
2f77fc4b
DG
2412 /* Kernel tracing */
2413 if (ksession != NULL) {
9b6c7ec5
DG
2414 ret = start_kernel_session(ksession, kernel_tracer_fd);
2415 if (ret != LTTNG_OK) {
2f77fc4b
DG
2416 goto error;
2417 }
2f77fc4b
DG
2418 }
2419
2420 /* Flag session that trace should start automatically */
2421 if (usess) {
14fb1ebe
DG
2422 /*
2423 * Even though the start trace might fail, flag this session active so
2424 * other application coming in are started by default.
2425 */
2426 usess->active = 1;
2f77fc4b
DG
2427
2428 ret = ust_app_start_trace_all(usess);
2429 if (ret < 0) {
f73fabfd 2430 ret = LTTNG_ERR_UST_START_FAIL;
2f77fc4b
DG
2431 goto error;
2432 }
2433 }
2434
8382cf6f
DG
2435 /* Flag this after a successful start. */
2436 session->has_been_started = 1;
2437 session->active = 1;
9b6c7ec5 2438
f73fabfd 2439 ret = LTTNG_OK;
2f77fc4b
DG
2440
2441error:
2442 return ret;
2443}
2444
2445/*
2446 * Command LTTNG_STOP_TRACE processed by the client thread.
2447 */
2448int cmd_stop_trace(struct ltt_session *session)
2449{
2450 int ret;
2451 struct ltt_kernel_channel *kchan;
2452 struct ltt_kernel_session *ksession;
2453 struct ltt_ust_session *usess;
2454
2455 assert(session);
2456
2457 /* Short cut */
2458 ksession = session->kernel_session;
2459 usess = session->ust_session;
2460
8382cf6f
DG
2461 /* Session is not active. Skip everythong and inform the client. */
2462 if (!session->active) {
f73fabfd 2463 ret = LTTNG_ERR_TRACE_ALREADY_STOPPED;
2f77fc4b
DG
2464 goto error;
2465 }
2466
2f77fc4b 2467 /* Kernel tracer */
14fb1ebe 2468 if (ksession && ksession->active) {
2f77fc4b
DG
2469 DBG("Stop kernel tracing");
2470
566d8970
MD
2471 ret = kernel_stop_session(ksession);
2472 if (ret < 0) {
2473 ret = LTTNG_ERR_KERN_STOP_FAIL;
2474 goto error;
2475 }
2476
2477 kernel_wait_quiescent(kernel_tracer_fd);
2478
2479 /* Flush metadata after stopping (if exists) */
2f77fc4b
DG
2480 if (ksession->metadata_stream_fd >= 0) {
2481 ret = kernel_metadata_flush_buffer(ksession->metadata_stream_fd);
2482 if (ret < 0) {
2483 ERR("Kernel metadata flush failed");
2484 }
2485 }
2486
566d8970 2487 /* Flush all buffers after stopping */
2f77fc4b
DG
2488 cds_list_for_each_entry(kchan, &ksession->channel_list.head, list) {
2489 ret = kernel_flush_buffer(kchan);
2490 if (ret < 0) {
2491 ERR("Kernel flush buffer error");
2492 }
2493 }
2494
14fb1ebe 2495 ksession->active = 0;
2f77fc4b
DG
2496 }
2497
14fb1ebe
DG
2498 if (usess && usess->active) {
2499 /*
2500 * Even though the stop trace might fail, flag this session inactive so
2501 * other application coming in are not started by default.
2502 */
2503 usess->active = 0;
2f77fc4b
DG
2504
2505 ret = ust_app_stop_trace_all(usess);
2506 if (ret < 0) {
f73fabfd 2507 ret = LTTNG_ERR_UST_STOP_FAIL;
2f77fc4b
DG
2508 goto error;
2509 }
2510 }
2511
8382cf6f
DG
2512 /* Flag inactive after a successful stop. */
2513 session->active = 0;
f73fabfd 2514 ret = LTTNG_OK;
2f77fc4b
DG
2515
2516error:
2517 return ret;
2518}
2519
2520/*
2521 * Command LTTNG_SET_CONSUMER_URI processed by the client thread.
2522 */
bda32d56
JG
2523int cmd_set_consumer_uri(struct ltt_session *session, size_t nb_uri,
2524 struct lttng_uri *uris)
2f77fc4b
DG
2525{
2526 int ret, i;
2527 struct ltt_kernel_session *ksess = session->kernel_session;
2528 struct ltt_ust_session *usess = session->ust_session;
2f77fc4b
DG
2529
2530 assert(session);
2531 assert(uris);
2532 assert(nb_uri > 0);
2533
8382cf6f
DG
2534 /* Can't set consumer URI if the session is active. */
2535 if (session->active) {
f73fabfd 2536 ret = LTTNG_ERR_TRACE_ALREADY_STARTED;
2f77fc4b
DG
2537 goto error;
2538 }
2539
bda32d56 2540 /* Set the "global" consumer URIs */
2f77fc4b 2541 for (i = 0; i < nb_uri; i++) {
bda32d56
JG
2542 ret = add_uri_to_consumer(session->consumer,
2543 &uris[i], 0, session->name);
a74934ba 2544 if (ret != LTTNG_OK) {
2f77fc4b
DG
2545 goto error;
2546 }
2f77fc4b
DG
2547 }
2548
bda32d56
JG
2549 /* Set UST session URIs */
2550 if (session->ust_session) {
2551 for (i = 0; i < nb_uri; i++) {
2552 ret = add_uri_to_consumer(
2553 session->ust_session->consumer,
2554 &uris[i], LTTNG_DOMAIN_UST,
2555 session->name);
2556 if (ret != LTTNG_OK) {
2557 goto error;
2558 }
2559 }
2560 }
2561
2562 /* Set kernel session URIs */
2563 if (session->kernel_session) {
2564 for (i = 0; i < nb_uri; i++) {
2565 ret = add_uri_to_consumer(
2566 session->kernel_session->consumer,
2567 &uris[i], LTTNG_DOMAIN_KERNEL,
2568 session->name);
2569 if (ret != LTTNG_OK) {
2570 goto error;
2571 }
2572 }
2573 }
2574
7ab70fe0
DG
2575 /*
2576 * Make sure to set the session in output mode after we set URI since a
2577 * session can be created without URL (thus flagged in no output mode).
2578 */
2579 session->output_traces = 1;
2580 if (ksess) {
2581 ksess->output_traces = 1;
bda32d56
JG
2582 }
2583
2584 if (usess) {
7ab70fe0
DG
2585 usess->output_traces = 1;
2586 }
2587
2f77fc4b 2588 /* All good! */
f73fabfd 2589 ret = LTTNG_OK;
2f77fc4b
DG
2590
2591error:
2592 return ret;
2593}
2594
2595/*
2596 * Command LTTNG_CREATE_SESSION processed by the client thread.
2597 */
2598int cmd_create_session_uri(char *name, struct lttng_uri *uris,
ecc48a90 2599 size_t nb_uri, lttng_sock_cred *creds, unsigned int live_timer)
2f77fc4b
DG
2600{
2601 int ret;
2f77fc4b
DG
2602 struct ltt_session *session;
2603
2604 assert(name);
2bba9e53 2605 assert(creds);
785d2d0d 2606
2f77fc4b
DG
2607 /*
2608 * Verify if the session already exist
2609 *
2610 * XXX: There is no need for the session lock list here since the caller
2611 * (process_client_msg) is holding it. We might want to change that so a
2612 * single command does not lock the entire session list.
2613 */
2614 session = session_find_by_name(name);
2615 if (session != NULL) {
f73fabfd 2616 ret = LTTNG_ERR_EXIST_SESS;
2f77fc4b
DG
2617 goto find_error;
2618 }
2619
2620 /* Create tracing session in the registry */
dec56f6c 2621 ret = session_create(name, LTTNG_SOCK_GET_UID_CRED(creds),
2f77fc4b 2622 LTTNG_SOCK_GET_GID_CRED(creds));
f73fabfd 2623 if (ret != LTTNG_OK) {
2f77fc4b
DG
2624 goto session_error;
2625 }
2626
2627 /*
2628 * Get the newly created session pointer back
2629 *
2630 * XXX: There is no need for the session lock list here since the caller
2631 * (process_client_msg) is holding it. We might want to change that so a
2632 * single command does not lock the entire session list.
2633 */
2634 session = session_find_by_name(name);
2635 assert(session);
2636
ecc48a90 2637 session->live_timer = live_timer;
2f77fc4b
DG
2638 /* Create default consumer output for the session not yet created. */
2639 session->consumer = consumer_create_output(CONSUMER_DST_LOCAL);
2640 if (session->consumer == NULL) {
f73fabfd 2641 ret = LTTNG_ERR_FATAL;
2f77fc4b
DG
2642 goto consumer_error;
2643 }
2644
2bba9e53 2645 if (uris) {
bda32d56 2646 ret = cmd_set_consumer_uri(session, nb_uri, uris);
2bba9e53
DG
2647 if (ret != LTTNG_OK) {
2648 goto consumer_error;
2649 }
2650 session->output_traces = 1;
2651 } else {
2652 session->output_traces = 0;
2653 DBG2("Session %s created with no output", session->name);
2f77fc4b
DG
2654 }
2655
2656 session->consumer->enabled = 1;
2657
f73fabfd 2658 return LTTNG_OK;
2f77fc4b
DG
2659
2660consumer_error:
2661 session_destroy(session);
2662session_error:
2663find_error:
2664 return ret;
2665}
2666
27babd3a
DG
2667/*
2668 * Command LTTNG_CREATE_SESSION_SNAPSHOT processed by the client thread.
2669 */
2670int cmd_create_session_snapshot(char *name, struct lttng_uri *uris,
2671 size_t nb_uri, lttng_sock_cred *creds)
2672{
2673 int ret;
2674 struct ltt_session *session;
2675 struct snapshot_output *new_output = NULL;
2676
2677 assert(name);
2678 assert(creds);
2679
2680 /*
2681 * Create session in no output mode with URIs set to NULL. The uris we've
2682 * received are for a default snapshot output if one.
2683 */
ae58b817 2684 ret = cmd_create_session_uri(name, NULL, 0, creds, 0);
27babd3a
DG
2685 if (ret != LTTNG_OK) {
2686 goto error;
2687 }
2688
2689 /* Get the newly created session pointer back. This should NEVER fail. */
2690 session = session_find_by_name(name);
2691 assert(session);
2692
2693 /* Flag session for snapshot mode. */
2694 session->snapshot_mode = 1;
2695
2696 /* Skip snapshot output creation if no URI is given. */
2697 if (nb_uri == 0) {
2698 goto end;
2699 }
2700
2701 new_output = snapshot_output_alloc();
2702 if (!new_output) {
2703 ret = LTTNG_ERR_NOMEM;
2704 goto error_snapshot_alloc;
2705 }
2706
2707 ret = snapshot_output_init_with_uri(DEFAULT_SNAPSHOT_MAX_SIZE, NULL,
2708 uris, nb_uri, session->consumer, new_output, &session->snapshot);
2709 if (ret < 0) {
2710 if (ret == -ENOMEM) {
2711 ret = LTTNG_ERR_NOMEM;
2712 } else {
2713 ret = LTTNG_ERR_INVALID;
2714 }
2715 goto error_snapshot;
2716 }
2717
2718 rcu_read_lock();
2719 snapshot_add_output(&session->snapshot, new_output);
2720 rcu_read_unlock();
2721
2722end:
2723 return LTTNG_OK;
2724
2725error_snapshot:
2726 snapshot_output_destroy(new_output);
2727error_snapshot_alloc:
2728 session_destroy(session);
2729error:
2730 return ret;
2731}
2732
2f77fc4b
DG
2733/*
2734 * Command LTTNG_DESTROY_SESSION processed by the client thread.
a9ad0c8f
MD
2735 *
2736 * Called with session lock held.
2f77fc4b
DG
2737 */
2738int cmd_destroy_session(struct ltt_session *session, int wpipe)
2739{
2740 int ret;
2741 struct ltt_ust_session *usess;
2742 struct ltt_kernel_session *ksess;
2743
2744 /* Safety net */
2745 assert(session);
2746
2747 usess = session->ust_session;
2748 ksess = session->kernel_session;
2749
2750 /* Clean kernel session teardown */
2751 kernel_destroy_session(ksess);
2752
2753 /* UST session teardown */
2754 if (usess) {
2755 /* Close any relayd session */
2756 consumer_output_send_destroy_relayd(usess->consumer);
2757
2758 /* Destroy every UST application related to this session. */
2759 ret = ust_app_destroy_trace_all(usess);
2760 if (ret) {
2761 ERR("Error in ust_app_destroy_trace_all");
2762 }
2763
2764 /* Clean up the rest. */
2765 trace_ust_destroy_session(usess);
2766 }
2767
2768 /*
2769 * Must notify the kernel thread here to update it's poll set in order to
2770 * remove the channel(s)' fd just destroyed.
2771 */
2772 ret = notify_thread_pipe(wpipe);
2773 if (ret < 0) {
2774 PERROR("write kernel poll pipe");
2775 }
2776
2777 ret = session_destroy(session);
2778
2779 return ret;
2780}
2781
2f77fc4b
DG
2782/*
2783 * Command LTTNG_REGISTER_CONSUMER processed by the client thread.
2784 */
56a37563
JG
2785int cmd_register_consumer(struct ltt_session *session,
2786 enum lttng_domain_type domain, const char *sock_path,
2787 struct consumer_data *cdata)
2f77fc4b
DG
2788{
2789 int ret, sock;
dd81b457 2790 struct consumer_socket *socket = NULL;
2f77fc4b
DG
2791
2792 assert(session);
2793 assert(cdata);
2794 assert(sock_path);
2795
2796 switch (domain) {
2797 case LTTNG_DOMAIN_KERNEL:
2798 {
2799 struct ltt_kernel_session *ksess = session->kernel_session;
2800
2801 assert(ksess);
2802
2803 /* Can't register a consumer if there is already one */
2804 if (ksess->consumer_fds_sent != 0) {
f73fabfd 2805 ret = LTTNG_ERR_KERN_CONSUMER_FAIL;
2f77fc4b
DG
2806 goto error;
2807 }
2808
2809 sock = lttcomm_connect_unix_sock(sock_path);
2810 if (sock < 0) {
f73fabfd 2811 ret = LTTNG_ERR_CONNECT_FAIL;
2f77fc4b
DG
2812 goto error;
2813 }
4ce514c4 2814 cdata->cmd_sock = sock;
2f77fc4b 2815
4ce514c4 2816 socket = consumer_allocate_socket(&cdata->cmd_sock);
2f77fc4b 2817 if (socket == NULL) {
f66c074c
DG
2818 ret = close(sock);
2819 if (ret < 0) {
2820 PERROR("close register consumer");
2821 }
4ce514c4 2822 cdata->cmd_sock = -1;
f73fabfd 2823 ret = LTTNG_ERR_FATAL;
2f77fc4b
DG
2824 goto error;
2825 }
2826
2827 socket->lock = zmalloc(sizeof(pthread_mutex_t));
2828 if (socket->lock == NULL) {
2829 PERROR("zmalloc pthread mutex");
f73fabfd 2830 ret = LTTNG_ERR_FATAL;
2f77fc4b
DG
2831 goto error;
2832 }
2833 pthread_mutex_init(socket->lock, NULL);
2834 socket->registered = 1;
2835
2836 rcu_read_lock();
2837 consumer_add_socket(socket, ksess->consumer);
2838 rcu_read_unlock();
2839
2840 pthread_mutex_lock(&cdata->pid_mutex);
2841 cdata->pid = -1;
2842 pthread_mutex_unlock(&cdata->pid_mutex);
2843
2844 break;
2845 }
2846 default:
2847 /* TODO: Userspace tracing */
f73fabfd 2848 ret = LTTNG_ERR_UND;
2f77fc4b
DG
2849 goto error;
2850 }
2851
dd81b457 2852 return LTTNG_OK;
2f77fc4b
DG
2853
2854error:
dd81b457
DG
2855 if (socket) {
2856 consumer_destroy_socket(socket);
2857 }
2f77fc4b
DG
2858 return ret;
2859}
2860
2861/*
2862 * Command LTTNG_LIST_DOMAINS processed by the client thread.
2863 */
2864ssize_t cmd_list_domains(struct ltt_session *session,
2865 struct lttng_domain **domains)
2866{
2867 int ret, index = 0;
2868 ssize_t nb_dom = 0;
fefd409b
DG
2869 struct agent *agt;
2870 struct lttng_ht_iter iter;
2f77fc4b
DG
2871
2872 if (session->kernel_session != NULL) {
2873 DBG3("Listing domains found kernel domain");
2874 nb_dom++;
2875 }
2876
2877 if (session->ust_session != NULL) {
2878 DBG3("Listing domains found UST global domain");
2879 nb_dom++;
3c6a091f 2880
e0a74f01 2881 rcu_read_lock();
fefd409b
DG
2882 cds_lfht_for_each_entry(session->ust_session->agents->ht, &iter.iter,
2883 agt, node.node) {
2884 if (agt->being_used) {
2885 nb_dom++;
2886 }
3c6a091f 2887 }
e0a74f01 2888 rcu_read_unlock();
2f77fc4b
DG
2889 }
2890
fa64dfb4
JG
2891 if (!nb_dom) {
2892 goto end;
2893 }
2894
2f77fc4b
DG
2895 *domains = zmalloc(nb_dom * sizeof(struct lttng_domain));
2896 if (*domains == NULL) {
f73fabfd 2897 ret = LTTNG_ERR_FATAL;
2f77fc4b
DG
2898 goto error;
2899 }
2900
2901 if (session->kernel_session != NULL) {
2902 (*domains)[index].type = LTTNG_DOMAIN_KERNEL;
b5edb9e8
PP
2903
2904 /* Kernel session buffer type is always GLOBAL */
2905 (*domains)[index].buf_type = LTTNG_BUFFER_GLOBAL;
2906
2f77fc4b
DG
2907 index++;
2908 }
2909
2910 if (session->ust_session != NULL) {
2911 (*domains)[index].type = LTTNG_DOMAIN_UST;
88c5f0d8 2912 (*domains)[index].buf_type = session->ust_session->buffer_type;
2f77fc4b 2913 index++;
3c6a091f 2914
e0a74f01 2915 rcu_read_lock();
fefd409b
DG
2916 cds_lfht_for_each_entry(session->ust_session->agents->ht, &iter.iter,
2917 agt, node.node) {
2918 if (agt->being_used) {
2919 (*domains)[index].type = agt->domain;
2920 (*domains)[index].buf_type = session->ust_session->buffer_type;
2921 index++;
2922 }
3c6a091f 2923 }
e0a74f01 2924 rcu_read_unlock();
2f77fc4b 2925 }
fa64dfb4 2926end:
2f77fc4b
DG
2927 return nb_dom;
2928
2929error:
f73fabfd
DG
2930 /* Return negative value to differentiate return code */
2931 return -ret;
2f77fc4b
DG
2932}
2933
2934
2935/*
2936 * Command LTTNG_LIST_CHANNELS processed by the client thread.
2937 */
56a37563
JG
2938ssize_t cmd_list_channels(enum lttng_domain_type domain,
2939 struct ltt_session *session, struct lttng_channel **channels)
2f77fc4b 2940{
53e367f9 2941 ssize_t nb_chan = 0, payload_size = 0, ret;
2f77fc4b
DG
2942
2943 switch (domain) {
2944 case LTTNG_DOMAIN_KERNEL:
2945 if (session->kernel_session != NULL) {
2946 nb_chan = session->kernel_session->channel_count;
2947 }
2948 DBG3("Number of kernel channels %zd", nb_chan);
c7d620a2 2949 if (nb_chan <= 0) {
53e367f9
JG
2950 ret = -LTTNG_ERR_KERN_CHAN_NOT_FOUND;
2951 goto end;
c7d620a2 2952 }
2f77fc4b
DG
2953 break;
2954 case LTTNG_DOMAIN_UST:
2955 if (session->ust_session != NULL) {
7ffc31a2 2956 rcu_read_lock();
2f77fc4b 2957 nb_chan = lttng_ht_get_count(
7ffc31a2
JG
2958 session->ust_session->domain_global.channels);
2959 rcu_read_unlock();
2f77fc4b
DG
2960 }
2961 DBG3("Number of UST global channels %zd", nb_chan);
ade7ce52 2962 if (nb_chan < 0) {
53e367f9
JG
2963 ret = -LTTNG_ERR_UST_CHAN_NOT_FOUND;
2964 goto end;
c7d620a2 2965 }
2f77fc4b
DG
2966 break;
2967 default:
53e367f9
JG
2968 ret = -LTTNG_ERR_UND;
2969 goto end;
2f77fc4b
DG
2970 }
2971
2972 if (nb_chan > 0) {
53e367f9 2973 const size_t channel_size = sizeof(struct lttng_channel) +
cf0bcb51
JG
2974 sizeof(struct lttng_channel_extended);
2975 struct lttng_channel_extended *channel_exts;
53e367f9
JG
2976
2977 payload_size = nb_chan * channel_size;
2978 *channels = zmalloc(payload_size);
2f77fc4b 2979 if (*channels == NULL) {
53e367f9
JG
2980 ret = -LTTNG_ERR_FATAL;
2981 goto end;
2f77fc4b
DG
2982 }
2983
53e367f9
JG
2984 channel_exts = ((void *) *channels) +
2985 (nb_chan * sizeof(struct lttng_channel));
d449df4a
MD
2986 ret = list_lttng_channels(domain, session, *channels, channel_exts);
2987 if (ret != LTTNG_OK) {
2988 free(*channels);
2989 *channels = NULL;
2990 goto end;
2991 }
53e367f9
JG
2992 } else {
2993 *channels = NULL;
2f77fc4b
DG
2994 }
2995
53e367f9
JG
2996 ret = payload_size;
2997end:
2998 return ret;
2f77fc4b
DG
2999}
3000
3001/*
3002 * Command LTTNG_LIST_EVENTS processed by the client thread.
3003 */
56a37563
JG
3004ssize_t cmd_list_events(enum lttng_domain_type domain,
3005 struct ltt_session *session, char *channel_name,
b4e3ceb9 3006 struct lttng_event **events, size_t *total_size)
2f77fc4b
DG
3007{
3008 int ret = 0;
3009 ssize_t nb_event = 0;
3010
3011 switch (domain) {
3012 case LTTNG_DOMAIN_KERNEL:
3013 if (session->kernel_session != NULL) {
3014 nb_event = list_lttng_kernel_events(channel_name,
b4e3ceb9
PP
3015 session->kernel_session, events,
3016 total_size);
2f77fc4b
DG
3017 }
3018 break;
3019 case LTTNG_DOMAIN_UST:
3020 {
3021 if (session->ust_session != NULL) {
3022 nb_event = list_lttng_ust_global_events(channel_name,
b4e3ceb9
PP
3023 &session->ust_session->domain_global, events,
3024 total_size);
2f77fc4b
DG
3025 }
3026 break;
3027 }
5cdb6027 3028 case LTTNG_DOMAIN_LOG4J:
3c6a091f 3029 case LTTNG_DOMAIN_JUL:
0e115563 3030 case LTTNG_DOMAIN_PYTHON:
3c6a091f 3031 if (session->ust_session) {
fefd409b
DG
3032 struct lttng_ht_iter iter;
3033 struct agent *agt;
3034
b11feea5 3035 rcu_read_lock();
fefd409b
DG
3036 cds_lfht_for_each_entry(session->ust_session->agents->ht,
3037 &iter.iter, agt, node.node) {
1dfd9906
JG
3038 if (agt->domain == domain) {
3039 nb_event = list_lttng_agent_events(
b4e3ceb9
PP
3040 agt, events,
3041 total_size);
1dfd9906
JG
3042 break;
3043 }
fefd409b 3044 }
b11feea5 3045 rcu_read_unlock();
3c6a091f
DG
3046 }
3047 break;
2f77fc4b 3048 default:
f73fabfd 3049 ret = LTTNG_ERR_UND;
2f77fc4b
DG
3050 goto error;
3051 }
3052
f73fabfd 3053 return nb_event;
2f77fc4b
DG
3054
3055error:
f73fabfd
DG
3056 /* Return negative value to differentiate return code */
3057 return -ret;
2f77fc4b
DG
3058}
3059
3060/*
3061 * Using the session list, filled a lttng_session array to send back to the
3062 * client for session listing.
3063 *
3064 * The session list lock MUST be acquired before calling this function. Use
3065 * session_lock_list() and session_unlock_list().
3066 */
3067void cmd_list_lttng_sessions(struct lttng_session *sessions, uid_t uid,
3068 gid_t gid)
3069{
3070 int ret;
3071 unsigned int i = 0;
3072 struct ltt_session *session;
3073 struct ltt_session_list *list = session_get_list();
3074
3075 DBG("Getting all available session for UID %d GID %d",
3076 uid, gid);
3077 /*
3078 * Iterate over session list and append data after the control struct in
3079 * the buffer.
3080 */
3081 cds_list_for_each_entry(session, &list->head, list) {
3082 /*
3083 * Only list the sessions the user can control.
3084 */
3085 if (!session_access_ok(session, uid, gid)) {
3086 continue;
3087 }
3088
3089 struct ltt_kernel_session *ksess = session->kernel_session;
3090 struct ltt_ust_session *usess = session->ust_session;
3091
3092 if (session->consumer->type == CONSUMER_DST_NET ||
3093 (ksess && ksess->consumer->type == CONSUMER_DST_NET) ||
3094 (usess && usess->consumer->type == CONSUMER_DST_NET)) {
3095 ret = build_network_session_path(sessions[i].path,
dec56f6c 3096 sizeof(sessions[i].path), session);
2f77fc4b 3097 } else {
dec56f6c 3098 ret = snprintf(sessions[i].path, sizeof(sessions[i].path), "%s",
2f77fc4b
DG
3099 session->consumer->dst.trace_path);
3100 }
3101 if (ret < 0) {
3102 PERROR("snprintf session path");
3103 continue;
3104 }
3105
3106 strncpy(sessions[i].name, session->name, NAME_MAX);
3107 sessions[i].name[NAME_MAX - 1] = '\0';
8382cf6f 3108 sessions[i].enabled = session->active;
2cbf8fed 3109 sessions[i].snapshot_mode = session->snapshot_mode;
8960e9cd 3110 sessions[i].live_timer_interval = session->live_timer;
2f77fc4b
DG
3111 i++;
3112 }
3113}
3114
806e2684 3115/*
6d805429 3116 * Command LTTNG_DATA_PENDING returning 0 if the data is NOT pending meaning
d3f14b8a 3117 * ready for trace analysis (or any kind of reader) or else 1 for pending data.
806e2684 3118 */
6d805429 3119int cmd_data_pending(struct ltt_session *session)
806e2684
DG
3120{
3121 int ret;
3122 struct ltt_kernel_session *ksess = session->kernel_session;
3123 struct ltt_ust_session *usess = session->ust_session;
3124
3125 assert(session);
3126
3127 /* Session MUST be stopped to ask for data availability. */
8382cf6f 3128 if (session->active) {
806e2684
DG
3129 ret = LTTNG_ERR_SESSION_STARTED;
3130 goto error;
3a89d11a
DG
3131 } else {
3132 /*
3133 * If stopped, just make sure we've started before else the above call
3134 * will always send that there is data pending.
3135 *
3136 * The consumer assumes that when the data pending command is received,
3137 * the trace has been started before or else no output data is written
3138 * by the streams which is a condition for data pending. So, this is
3139 * *VERY* important that we don't ask the consumer before a start
3140 * trace.
3141 */
8382cf6f 3142 if (!session->has_been_started) {
3a89d11a
DG
3143 ret = 0;
3144 goto error;
3145 }
806e2684
DG
3146 }
3147
3148 if (ksess && ksess->consumer) {
6d805429
DG
3149 ret = consumer_is_data_pending(ksess->id, ksess->consumer);
3150 if (ret == 1) {
806e2684
DG
3151 /* Data is still being extracted for the kernel. */
3152 goto error;
3153 }
3154 }
3155
3156 if (usess && usess->consumer) {
6d805429
DG
3157 ret = consumer_is_data_pending(usess->id, usess->consumer);
3158 if (ret == 1) {
806e2684
DG
3159 /* Data is still being extracted for the kernel. */
3160 goto error;
3161 }
3162 }
3163
3164 /* Data is ready to be read by a viewer */
6d805429 3165 ret = 0;
806e2684
DG
3166
3167error:
3168 return ret;
3169}
3170
6dc3064a
DG
3171/*
3172 * Command LTTNG_SNAPSHOT_ADD_OUTPUT from the lttng ctl library.
3173 *
3174 * Return LTTNG_OK on success or else a LTTNG_ERR code.
3175 */
3176int cmd_snapshot_add_output(struct ltt_session *session,
3177 struct lttng_snapshot_output *output, uint32_t *id)
3178{
3179 int ret;
3180 struct snapshot_output *new_output;
3181
3182 assert(session);
3183 assert(output);
3184
3185 DBG("Cmd snapshot add output for session %s", session->name);
3186
3187 /*
903ef685 3188 * Can't create an output if the session is not set in no-output mode.
6dc3064a
DG
3189 */
3190 if (session->output_traces) {
903ef685 3191 ret = LTTNG_ERR_NOT_SNAPSHOT_SESSION;
6dc3064a
DG
3192 goto error;
3193 }
3194
3195 /* Only one output is allowed until we have the "tee" feature. */
3196 if (session->snapshot.nb_output == 1) {
3197 ret = LTTNG_ERR_SNAPSHOT_OUTPUT_EXIST;
3198 goto error;
3199 }
3200
3201 new_output = snapshot_output_alloc();
3202 if (!new_output) {
3203 ret = LTTNG_ERR_NOMEM;
3204 goto error;
3205 }
3206
3207 ret = snapshot_output_init(output->max_size, output->name,
3208 output->ctrl_url, output->data_url, session->consumer, new_output,
3209 &session->snapshot);
3210 if (ret < 0) {
3211 if (ret == -ENOMEM) {
3212 ret = LTTNG_ERR_NOMEM;
3213 } else {
3214 ret = LTTNG_ERR_INVALID;
3215 }
3216 goto free_error;
3217 }
3218
6dc3064a
DG
3219 rcu_read_lock();
3220 snapshot_add_output(&session->snapshot, new_output);
3221 if (id) {
3222 *id = new_output->id;
3223 }
3224 rcu_read_unlock();
3225
3226 return LTTNG_OK;
3227
3228free_error:
3229 snapshot_output_destroy(new_output);
3230error:
3231 return ret;
3232}
3233
3234/*
3235 * Command LTTNG_SNAPSHOT_DEL_OUTPUT from lib lttng ctl.
3236 *
3237 * Return LTTNG_OK on success or else a LTTNG_ERR code.
3238 */
3239int cmd_snapshot_del_output(struct ltt_session *session,
3240 struct lttng_snapshot_output *output)
3241{
3242 int ret;
eb240553 3243 struct snapshot_output *sout = NULL;
6dc3064a
DG
3244
3245 assert(session);
3246 assert(output);
3247
6dc3064a
DG
3248 rcu_read_lock();
3249
3250 /*
d3f14b8a
MD
3251 * Permission denied to create an output if the session is not
3252 * set in no output mode.
6dc3064a
DG
3253 */
3254 if (session->output_traces) {
903ef685 3255 ret = LTTNG_ERR_NOT_SNAPSHOT_SESSION;
6dc3064a
DG
3256 goto error;
3257 }
3258
eb240553
DG
3259 if (output->id) {
3260 DBG("Cmd snapshot del output id %" PRIu32 " for session %s", output->id,
3261 session->name);
3262 sout = snapshot_find_output_by_id(output->id, &session->snapshot);
3263 } else if (*output->name != '\0') {
3264 DBG("Cmd snapshot del output name %s for session %s", output->name,
3265 session->name);
3266 sout = snapshot_find_output_by_name(output->name, &session->snapshot);
3267 }
6dc3064a
DG
3268 if (!sout) {
3269 ret = LTTNG_ERR_INVALID;
3270 goto error;
3271 }
3272
3273 snapshot_delete_output(&session->snapshot, sout);
3274 snapshot_output_destroy(sout);
3275 ret = LTTNG_OK;
3276
3277error:
3278 rcu_read_unlock();
3279 return ret;
3280}
3281
3282/*
3283 * Command LTTNG_SNAPSHOT_LIST_OUTPUT from lib lttng ctl.
3284 *
3285 * If no output is available, outputs is untouched and 0 is returned.
3286 *
3287 * Return the size of the newly allocated outputs or a negative LTTNG_ERR code.
3288 */
3289ssize_t cmd_snapshot_list_outputs(struct ltt_session *session,
3290 struct lttng_snapshot_output **outputs)
3291{
3292 int ret, idx = 0;
b223ca94 3293 struct lttng_snapshot_output *list = NULL;
6dc3064a
DG
3294 struct lttng_ht_iter iter;
3295 struct snapshot_output *output;
3296
3297 assert(session);
3298 assert(outputs);
3299
3300 DBG("Cmd snapshot list outputs for session %s", session->name);
3301
3302 /*
d3f14b8a
MD
3303 * Permission denied to create an output if the session is not
3304 * set in no output mode.
6dc3064a
DG
3305 */
3306 if (session->output_traces) {
903ef685
JG
3307 ret = -LTTNG_ERR_NOT_SNAPSHOT_SESSION;
3308 goto end;
6dc3064a
DG
3309 }
3310
3311 if (session->snapshot.nb_output == 0) {
3312 ret = 0;
903ef685 3313 goto end;
6dc3064a
DG
3314 }
3315
3316 list = zmalloc(session->snapshot.nb_output * sizeof(*list));
3317 if (!list) {
b223ca94 3318 ret = -LTTNG_ERR_NOMEM;
903ef685 3319 goto end;
6dc3064a
DG
3320 }
3321
3322 /* Copy list from session to the new list object. */
b223ca94 3323 rcu_read_lock();
6dc3064a
DG
3324 cds_lfht_for_each_entry(session->snapshot.output_ht->ht, &iter.iter,
3325 output, node.node) {
3326 assert(output->consumer);
3327 list[idx].id = output->id;
3328 list[idx].max_size = output->max_size;
6ce22875
MD
3329 if (lttng_strncpy(list[idx].name, output->name,
3330 sizeof(list[idx].name))) {
3331 ret = -LTTNG_ERR_INVALID;
903ef685 3332 goto error;
6ce22875 3333 }
6dc3064a 3334 if (output->consumer->type == CONSUMER_DST_LOCAL) {
6ce22875
MD
3335 if (lttng_strncpy(list[idx].ctrl_url,
3336 output->consumer->dst.trace_path,
3337 sizeof(list[idx].ctrl_url))) {
3338 ret = -LTTNG_ERR_INVALID;
903ef685 3339 goto error;
6ce22875 3340 }
6dc3064a
DG
3341 } else {
3342 /* Control URI. */
3343 ret = uri_to_str_url(&output->consumer->dst.net.control,
3344 list[idx].ctrl_url, sizeof(list[idx].ctrl_url));
3345 if (ret < 0) {
b223ca94 3346 ret = -LTTNG_ERR_NOMEM;
903ef685 3347 goto error;
6dc3064a
DG
3348 }
3349
3350 /* Data URI. */
3351 ret = uri_to_str_url(&output->consumer->dst.net.data,
3352 list[idx].data_url, sizeof(list[idx].data_url));
3353 if (ret < 0) {
b223ca94 3354 ret = -LTTNG_ERR_NOMEM;
903ef685 3355 goto error;
6dc3064a
DG
3356 }
3357 }
3358 idx++;
3359 }
3360
3361 *outputs = list;
b223ca94
JG
3362 list = NULL;
3363 ret = session->snapshot.nb_output;
6dc3064a 3364error:
903ef685 3365 rcu_read_unlock();
b223ca94 3366 free(list);
903ef685 3367end:
b223ca94 3368 return ret;
6dc3064a
DG
3369}
3370
93ec662e
JD
3371/*
3372 * Check if we can regenerate the metadata for this session.
3373 * Only kernel, UST per-uid and non-live sessions are supported.
3374 *
3375 * Return 0 if the metadata can be generated, a LTTNG_ERR code otherwise.
3376 */
3377static
eded6438 3378int check_regenerate_metadata_support(struct ltt_session *session)
93ec662e
JD
3379{
3380 int ret;
3381
3382 assert(session);
3383
3384 if (session->live_timer != 0) {
3385 ret = LTTNG_ERR_LIVE_SESSION;
3386 goto end;
3387 }
3388 if (!session->active) {
3389 ret = LTTNG_ERR_SESSION_NOT_STARTED;
3390 goto end;
3391 }
3392 if (session->ust_session) {
3393 switch (session->ust_session->buffer_type) {
3394 case LTTNG_BUFFER_PER_UID:
3395 break;
3396 case LTTNG_BUFFER_PER_PID:
3397 ret = LTTNG_ERR_PER_PID_SESSION;
3398 goto end;
3399 default:
3400 assert(0);
3401 ret = LTTNG_ERR_UNK;
3402 goto end;
3403 }
3404 }
3405 if (session->consumer->type == CONSUMER_DST_NET &&
3406 session->consumer->relay_minor_version < 8) {
3407 ret = LTTNG_ERR_RELAYD_VERSION_FAIL;
3408 goto end;
3409 }
3410 ret = 0;
3411
3412end:
3413 return ret;
3414}
3415
7802bae3
LL
3416static
3417int clear_metadata_file(int fd)
3418{
3419 int ret;
3420
3421 ret = lseek(fd, 0, SEEK_SET);
3422 if (ret < 0) {
3423 PERROR("lseek");
3424 goto end;
3425 }
3426
3427 ret = ftruncate(fd, 0);
3428 if (ret < 0) {
3429 PERROR("ftruncate");
3430 goto end;
3431 }
3432
3433end:
3434 return ret;
3435}
3436
93ec662e 3437static
eded6438 3438int ust_regenerate_metadata(struct ltt_ust_session *usess)
93ec662e
JD
3439{
3440 int ret = 0;
3441 struct buffer_reg_uid *uid_reg = NULL;
3442 struct buffer_reg_session *session_reg = NULL;
3443
3444 rcu_read_lock();
3445 cds_list_for_each_entry(uid_reg, &usess->buffer_reg_uid_list, lnode) {
3446 struct ust_registry_session *registry;
3447 struct ust_registry_channel *chan;
3448 struct lttng_ht_iter iter_chan;
3449
3450 session_reg = uid_reg->registry;
3451 registry = session_reg->reg.ust;
3452
3453 pthread_mutex_lock(&registry->lock);
3454 registry->metadata_len_sent = 0;
3455 memset(registry->metadata, 0, registry->metadata_alloc_len);
3456 registry->metadata_len = 0;
3457 registry->metadata_version++;
7802bae3
LL
3458 if (registry->metadata_fd > 0) {
3459 /* Clear the metadata file's content. */
3460 ret = clear_metadata_file(registry->metadata_fd);
3461 if (ret) {
3462 pthread_mutex_unlock(&registry->lock);
3463 goto end;
3464 }
3465 }
3466
93ec662e
JD
3467 ret = ust_metadata_session_statedump(registry, NULL,
3468 registry->major, registry->minor);
3469 if (ret) {
3470 pthread_mutex_unlock(&registry->lock);
3471 ERR("Failed to generate session metadata (err = %d)",
3472 ret);
3473 goto end;
3474 }
3475 cds_lfht_for_each_entry(registry->channels->ht, &iter_chan.iter,
3476 chan, node.node) {
3477 struct ust_registry_event *event;
3478 struct lttng_ht_iter iter_event;
3479
3480 ret = ust_metadata_channel_statedump(registry, chan);
3481 if (ret) {
3482 pthread_mutex_unlock(&registry->lock);
3483 ERR("Failed to generate channel metadata "
3484 "(err = %d)", ret);
3485 goto end;
3486 }
3487 cds_lfht_for_each_entry(chan->ht->ht, &iter_event.iter,
3488 event, node.node) {
3489 ret = ust_metadata_event_statedump(registry,
3490 chan, event);
3491 if (ret) {
3492 pthread_mutex_unlock(&registry->lock);
3493 ERR("Failed to generate event metadata "
3494 "(err = %d)", ret);
3495 goto end;
3496 }
3497 }
3498 }
3499 pthread_mutex_unlock(&registry->lock);
3500 }
3501
3502end:
3503 rcu_read_unlock();
3504 return ret;
3505}
3506
3507/*
eded6438 3508 * Command LTTNG_REGENERATE_METADATA from the lttng-ctl library.
93ec662e
JD
3509 *
3510 * Ask the consumer to truncate the existing metadata file(s) and
3511 * then regenerate the metadata. Live and per-pid sessions are not
3512 * supported and return an error.
3513 *
3514 * Return 0 on success or else a LTTNG_ERR code.
3515 */
eded6438 3516int cmd_regenerate_metadata(struct ltt_session *session)
93ec662e
JD
3517{
3518 int ret;
3519
3520 assert(session);
3521
eded6438 3522 ret = check_regenerate_metadata_support(session);
93ec662e
JD
3523 if (ret) {
3524 goto end;
3525 }
3526
3527 if (session->kernel_session) {
eded6438 3528 ret = kernctl_session_regenerate_metadata(
93ec662e
JD
3529 session->kernel_session->fd);
3530 if (ret < 0) {
3531 ERR("Failed to regenerate the kernel metadata");
3532 goto end;
3533 }
3534 }
3535
3536 if (session->ust_session) {
eded6438 3537 ret = ust_regenerate_metadata(session->ust_session);
93ec662e
JD
3538 if (ret < 0) {
3539 ERR("Failed to regenerate the UST metadata");
3540 goto end;
3541 }
3542 }
3543 DBG("Cmd metadata regenerate for session %s", session->name);
3544 ret = LTTNG_OK;
3545
3546end:
3547 return ret;
3548}
3549
c2561365
JD
3550/*
3551 * Command LTTNG_REGENERATE_STATEDUMP from the lttng-ctl library.
3552 *
3553 * Ask the tracer to regenerate a new statedump.
3554 *
3555 * Return 0 on success or else a LTTNG_ERR code.
3556 */
3557int cmd_regenerate_statedump(struct ltt_session *session)
3558{
3559 int ret;
3560
3561 assert(session);
3562
3563 if (!session->active) {
3564 ret = LTTNG_ERR_SESSION_NOT_STARTED;
3565 goto end;
3566 }
c2561365
JD
3567
3568 if (session->kernel_session) {
3569 ret = kernctl_session_regenerate_statedump(
3570 session->kernel_session->fd);
3571 /*
3572 * Currently, the statedump in kernel can only fail if out
3573 * of memory.
3574 */
3575 if (ret < 0) {
3576 if (ret == -ENOMEM) {
3577 ret = LTTNG_ERR_REGEN_STATEDUMP_NOMEM;
3578 } else {
3579 ret = LTTNG_ERR_REGEN_STATEDUMP_FAIL;
3580 }
3581 ERR("Failed to regenerate the kernel statedump");
3582 goto end;
3583 }
3584 }
3585
3586 if (session->ust_session) {
3587 ret = ust_app_regenerate_statedump_all(session->ust_session);
3588 /*
3589 * Currently, the statedump in UST always returns 0.
3590 */
3591 if (ret < 0) {
3592 ret = LTTNG_ERR_REGEN_STATEDUMP_FAIL;
3593 ERR("Failed to regenerate the UST statedump");
3594 goto end;
3595 }
3596 }
3597 DBG("Cmd regenerate statedump for session %s", session->name);
3598 ret = LTTNG_OK;
3599
3600end:
3601 return ret;
3602}
3603
b0880ae5
JG
3604int cmd_register_trigger(struct command_ctx *cmd_ctx, int sock,
3605 struct notification_thread_handle *notification_thread)
3606{
3607 int ret;
3608 size_t trigger_len;
3609 ssize_t sock_recv_len;
3610 struct lttng_trigger *trigger = NULL;
3611 struct lttng_buffer_view view;
3612 struct lttng_dynamic_buffer trigger_buffer;
3613
3614 lttng_dynamic_buffer_init(&trigger_buffer);
3615 trigger_len = (size_t) cmd_ctx->lsm->u.trigger.length;
3616 ret = lttng_dynamic_buffer_set_size(&trigger_buffer, trigger_len);
3617 if (ret) {
3618 ret = LTTNG_ERR_NOMEM;
3619 goto end;
3620 }
3621
3622 sock_recv_len = lttcomm_recv_unix_sock(sock, trigger_buffer.data,
3623 trigger_len);
3624 if (sock_recv_len < 0 || sock_recv_len != trigger_len) {
3625 ERR("Failed to receive \"register trigger\" command payload");
3626 /* TODO: should this be a new error enum ? */
3627 ret = LTTNG_ERR_INVALID_TRIGGER;
3628 goto end;
3629 }
3630
3631 view = lttng_buffer_view_from_dynamic_buffer(&trigger_buffer, 0, -1);
3632 if (lttng_trigger_create_from_buffer(&view, &trigger) !=
3633 trigger_len) {
3634 ERR("Invalid trigger payload received in \"register trigger\" command");
3635 ret = LTTNG_ERR_INVALID_TRIGGER;
3636 goto end;
3637 }
3638
3639 ret = notification_thread_command_register_trigger(notification_thread,
3640 trigger);
587f9fd0
JG
3641 /* Ownership of trigger was transferred. */
3642 trigger = NULL;
b0880ae5 3643end:
587f9fd0 3644 lttng_trigger_destroy(trigger);
b0880ae5
JG
3645 lttng_dynamic_buffer_reset(&trigger_buffer);
3646 return ret;
3647}
3648
3649int cmd_unregister_trigger(struct command_ctx *cmd_ctx, int sock,
3650 struct notification_thread_handle *notification_thread)
3651{
3652 int ret;
3653 size_t trigger_len;
3654 ssize_t sock_recv_len;
3655 struct lttng_trigger *trigger = NULL;
3656 struct lttng_buffer_view view;
3657 struct lttng_dynamic_buffer trigger_buffer;
3658
3659 lttng_dynamic_buffer_init(&trigger_buffer);
3660 trigger_len = (size_t) cmd_ctx->lsm->u.trigger.length;
3661 ret = lttng_dynamic_buffer_set_size(&trigger_buffer, trigger_len);
3662 if (ret) {
3663 ret = LTTNG_ERR_NOMEM;
3664 goto end;
3665 }
3666
3667 sock_recv_len = lttcomm_recv_unix_sock(sock, trigger_buffer.data,
3668 trigger_len);
3669 if (sock_recv_len < 0 || sock_recv_len != trigger_len) {
3670 ERR("Failed to receive \"unregister trigger\" command payload");
3671 /* TODO: should this be a new error enum ? */
3672 ret = LTTNG_ERR_INVALID_TRIGGER;
3673 goto end;
3674 }
3675
3676 view = lttng_buffer_view_from_dynamic_buffer(&trigger_buffer, 0, -1);
3677 if (lttng_trigger_create_from_buffer(&view, &trigger) !=
3678 trigger_len) {
3679 ERR("Invalid trigger payload received in \"unregister trigger\" command");
3680 ret = LTTNG_ERR_INVALID_TRIGGER;
3681 goto end;
3682 }
3683
3684 ret = notification_thread_command_unregister_trigger(notification_thread,
3685 trigger);
3686end:
587f9fd0 3687 lttng_trigger_destroy(trigger);
b0880ae5
JG
3688 lttng_dynamic_buffer_reset(&trigger_buffer);
3689 return ret;
3690}
3691
6dc3064a
DG
3692/*
3693 * Send relayd sockets from snapshot output to consumer. Ignore request if the
3694 * snapshot output is *not* set with a remote destination.
3695 *
a934f4af 3696 * Return 0 on success or a LTTNG_ERR code.
6dc3064a
DG
3697 */
3698static int set_relayd_for_snapshot(struct consumer_output *consumer,
3699 struct snapshot_output *snap_output, struct ltt_session *session)
3700{
a934f4af 3701 int ret = LTTNG_OK;
6dc3064a
DG
3702 struct lttng_ht_iter iter;
3703 struct consumer_socket *socket;
3704
3705 assert(consumer);
3706 assert(snap_output);
3707 assert(session);
3708
3709 DBG2("Set relayd object from snapshot output");
3710
3711 /* Ignore if snapshot consumer output is not network. */
3712 if (snap_output->consumer->type != CONSUMER_DST_NET) {
3713 goto error;
3714 }
3715
3716 /*
3717 * For each consumer socket, create and send the relayd object of the
3718 * snapshot output.
3719 */
3720 rcu_read_lock();
5eecee74
DG
3721 cds_lfht_for_each_entry(snap_output->consumer->socks->ht, &iter.iter,
3722 socket, node.node) {
ecd0f96d 3723 pthread_mutex_lock(socket->lock);
6dc3064a 3724 ret = send_consumer_relayd_sockets(0, session->id,
d3e2ba59
JD
3725 snap_output->consumer, socket,
3726 session->name, session->hostname,
3727 session->live_timer);
ecd0f96d 3728 pthread_mutex_unlock(socket->lock);
a934f4af 3729 if (ret != LTTNG_OK) {
6dc3064a
DG
3730 rcu_read_unlock();
3731 goto error;
3732 }
3733 }
3734 rcu_read_unlock();
3735
3736error:
3737 return ret;
3738}
3739
3740/*
3741 * Record a kernel snapshot.
3742 *
fac41e72 3743 * Return LTTNG_OK on success or a LTTNG_ERR code.
6dc3064a
DG
3744 */
3745static int record_kernel_snapshot(struct ltt_kernel_session *ksess,
5c786ded 3746 struct snapshot_output *output, struct ltt_session *session,
d07ceecd 3747 int wait, uint64_t nb_packets_per_stream)
6dc3064a
DG
3748{
3749 int ret;
3750
3751 assert(ksess);
3752 assert(output);
3753 assert(session);
3754
10a50311 3755
af706bb7
DG
3756 /*
3757 * Copy kernel session sockets so we can communicate with the right
3758 * consumer for the snapshot record command.
3759 */
3760 ret = consumer_copy_sockets(output->consumer, ksess->consumer);
3761 if (ret < 0) {
a934f4af 3762 ret = LTTNG_ERR_NOMEM;
af706bb7 3763 goto error;
6dc3064a
DG
3764 }
3765
3766 ret = set_relayd_for_snapshot(ksess->consumer, output, session);
a934f4af 3767 if (ret != LTTNG_OK) {
af706bb7 3768 goto error_snapshot;
6dc3064a
DG
3769 }
3770
d07ceecd 3771 ret = kernel_snapshot_record(ksess, output, wait, nb_packets_per_stream);
2a06df8d 3772 if (ret != LTTNG_OK) {
af706bb7 3773 goto error_snapshot;
6dc3064a
DG
3774 }
3775
a934f4af 3776 ret = LTTNG_OK;
1371fc12 3777 goto end;
a934f4af 3778
af706bb7
DG
3779error_snapshot:
3780 /* Clean up copied sockets so this output can use some other later on. */
3781 consumer_destroy_output_sockets(output->consumer);
6dc3064a 3782error:
1371fc12 3783end:
6dc3064a
DG
3784 return ret;
3785}
3786
3787/*
3788 * Record a UST snapshot.
3789 *
a934f4af 3790 * Return 0 on success or a LTTNG_ERR error code.
6dc3064a
DG
3791 */
3792static int record_ust_snapshot(struct ltt_ust_session *usess,
5c786ded 3793 struct snapshot_output *output, struct ltt_session *session,
d07ceecd 3794 int wait, uint64_t nb_packets_per_stream)
6dc3064a
DG
3795{
3796 int ret;
3797
3798 assert(usess);
3799 assert(output);
3800 assert(session);
3801
af706bb7 3802 /*
d3f14b8a 3803 * Copy UST session sockets so we can communicate with the right
af706bb7
DG
3804 * consumer for the snapshot record command.
3805 */
3806 ret = consumer_copy_sockets(output->consumer, usess->consumer);
3807 if (ret < 0) {
a934f4af 3808 ret = LTTNG_ERR_NOMEM;
af706bb7 3809 goto error;
6dc3064a
DG
3810 }
3811
3812 ret = set_relayd_for_snapshot(usess->consumer, output, session);
a934f4af 3813 if (ret != LTTNG_OK) {
af706bb7 3814 goto error_snapshot;
6dc3064a
DG
3815 }
3816
d07ceecd 3817 ret = ust_app_snapshot_record(usess, output, wait, nb_packets_per_stream);
6dc3064a 3818 if (ret < 0) {
7badf927
DG
3819 switch (-ret) {
3820 case EINVAL:
a934f4af 3821 ret = LTTNG_ERR_INVALID;
7badf927 3822 break;
7badf927
DG
3823 default:
3824 ret = LTTNG_ERR_SNAPSHOT_FAIL;
3825 break;
5c786ded 3826 }
af706bb7 3827 goto error_snapshot;
6dc3064a
DG
3828 }
3829
a934f4af
DG
3830 ret = LTTNG_OK;
3831
af706bb7
DG
3832error_snapshot:
3833 /* Clean up copied sockets so this output can use some other later on. */
3834 consumer_destroy_output_sockets(output->consumer);
6dc3064a
DG
3835error:
3836 return ret;
3837}
3838
d07ceecd
MD
3839static
3840uint64_t get_session_size_one_more_packet_per_stream(struct ltt_session *session,
3841 uint64_t cur_nr_packets)
68808f4e 3842{
d07ceecd 3843 uint64_t tot_size = 0;
68808f4e
DG
3844
3845 if (session->kernel_session) {
3846 struct ltt_kernel_channel *chan;
3847 struct ltt_kernel_session *ksess = session->kernel_session;
3848
68808f4e 3849 cds_list_for_each_entry(chan, &ksess->channel_list.head, list) {
d07ceecd
MD
3850 if (cur_nr_packets >= chan->channel->attr.num_subbuf) {
3851 /*
3852 * Don't take channel into account if we
3853 * already grab all its packets.
3854 */
3855 continue;
68808f4e 3856 }
d07ceecd
MD
3857 tot_size += chan->channel->attr.subbuf_size
3858 * chan->stream_count;
68808f4e
DG
3859 }
3860 }
3861
3862 if (session->ust_session) {
68808f4e
DG
3863 struct ltt_ust_session *usess = session->ust_session;
3864
d07ceecd
MD
3865 tot_size += ust_app_get_size_one_more_packet_per_stream(usess,
3866 cur_nr_packets);
68808f4e
DG
3867 }
3868
d07ceecd 3869 return tot_size;
68808f4e
DG
3870}
3871
5c786ded 3872/*
d07ceecd
MD
3873 * Calculate the number of packets we can grab from each stream that
3874 * fits within the overall snapshot max size.
3875 *
3876 * Returns -1 on error, 0 means infinite number of packets, else > 0 is
3877 * the number of packets per stream.
3878 *
3879 * TODO: this approach is not perfect: we consider the worse case
3880 * (packet filling the sub-buffers) as an upper bound, but we could do
3881 * better if we do this calculation while we actually grab the packet
3882 * content: we would know how much padding we don't actually store into
3883 * the file.
3884 *
3885 * This algorithm is currently bounded by the number of packets per
3886 * stream.
3887 *
3888 * Since we call this algorithm before actually grabbing the data, it's
3889 * an approximation: for instance, applications could appear/disappear
3890 * in between this call and actually grabbing data.
5c786ded 3891 */
d07ceecd
MD
3892static
3893int64_t get_session_nb_packets_per_stream(struct ltt_session *session, uint64_t max_size)
5c786ded 3894{
d07ceecd
MD
3895 int64_t size_left;
3896 uint64_t cur_nb_packets = 0;
5c786ded 3897
d07ceecd
MD
3898 if (!max_size) {
3899 return 0; /* Infinite */
5c786ded
JD
3900 }
3901
d07ceecd
MD
3902 size_left = max_size;
3903 for (;;) {
3904 uint64_t one_more_packet_tot_size;
5c786ded 3905
d07ceecd
MD
3906 one_more_packet_tot_size = get_session_size_one_more_packet_per_stream(session,
3907 cur_nb_packets);
3908 if (!one_more_packet_tot_size) {
3909 /* We are already grabbing all packets. */
3910 break;
3911 }
3912 size_left -= one_more_packet_tot_size;
3913 if (size_left < 0) {
3914 break;
3915 }
3916 cur_nb_packets++;
5c786ded 3917 }
d07ceecd
MD
3918 if (!cur_nb_packets) {
3919 /* Not enough room to grab one packet of each stream, error. */
3920 return -1;
3921 }
3922 return cur_nb_packets;
5c786ded
JD
3923}
3924
6dc3064a
DG
3925/*
3926 * Command LTTNG_SNAPSHOT_RECORD from lib lttng ctl.
3927 *
3928 * The wait parameter is ignored so this call always wait for the snapshot to
3929 * complete before returning.
3930 *
3931 * Return LTTNG_OK on success or else a LTTNG_ERR code.
3932 */
3933int cmd_snapshot_record(struct ltt_session *session,
3934 struct lttng_snapshot_output *output, int wait)
3935{
3936 int ret = LTTNG_OK;
e1986656
DG
3937 unsigned int use_tmp_output = 0;
3938 struct snapshot_output tmp_output;
00e1dfc4 3939 unsigned int snapshot_success = 0;
10ba83fe 3940 char datetime[16];
6dc3064a
DG
3941
3942 assert(session);
ba45d9f0 3943 assert(output);
6dc3064a
DG
3944
3945 DBG("Cmd snapshot record for session %s", session->name);
3946
10ba83fe
JR
3947 /* Get the datetime for the snapshot output directory. */
3948 ret = utils_get_current_time_str("%Y%m%d-%H%M%S", datetime,
3949 sizeof(datetime));
3950 if (!ret) {
3951 ret = LTTNG_ERR_INVALID;
3952 goto error;
3953 }
3954
6dc3064a 3955 /*
d3f14b8a
MD
3956 * Permission denied to create an output if the session is not
3957 * set in no output mode.
6dc3064a
DG
3958 */
3959 if (session->output_traces) {
903ef685 3960 ret = LTTNG_ERR_NOT_SNAPSHOT_SESSION;
6dc3064a
DG
3961 goto error;
3962 }
3963
3964 /* The session needs to be started at least once. */
8382cf6f 3965 if (!session->has_been_started) {
6dc3064a
DG
3966 ret = LTTNG_ERR_START_SESSION_ONCE;
3967 goto error;
3968 }
3969
3970 /* Use temporary output for the session. */
ba45d9f0 3971 if (*output->ctrl_url != '\0') {
6dc3064a
DG
3972 ret = snapshot_output_init(output->max_size, output->name,
3973 output->ctrl_url, output->data_url, session->consumer,
e1986656 3974 &tmp_output, NULL);
6dc3064a
DG
3975 if (ret < 0) {
3976 if (ret == -ENOMEM) {
3977 ret = LTTNG_ERR_NOMEM;
3978 } else {
3979 ret = LTTNG_ERR_INVALID;
3980 }
3981 goto error;
3982 }
1bfe7328
DG
3983 /* Use the global session count for the temporary snapshot. */
3984 tmp_output.nb_snapshot = session->snapshot.nb_snapshot;
10ba83fe
JR
3985
3986 /* Use the global datetime */
3987 memcpy(tmp_output.datetime, datetime, sizeof(datetime));
e1986656 3988 use_tmp_output = 1;
6dc3064a
DG
3989 }
3990
804c90a8
JR
3991 if (use_tmp_output) {
3992 int64_t nb_packets_per_stream;
6dc3064a 3993
804c90a8
JR
3994 nb_packets_per_stream = get_session_nb_packets_per_stream(session,
3995 tmp_output.max_size);
3996 if (nb_packets_per_stream < 0) {
3997 ret = LTTNG_ERR_MAX_SIZE_INVALID;
3998 goto error;
3999 }
d07ceecd 4000
804c90a8
JR
4001 if (session->kernel_session) {
4002 ret = record_kernel_snapshot(session->kernel_session,
4003 &tmp_output, session,
4004 wait, nb_packets_per_stream);
4005 if (ret != LTTNG_OK) {
d07ceecd
MD
4006 goto error;
4007 }
804c90a8
JR
4008 }
4009
4010 if (session->ust_session) {
4011 ret = record_ust_snapshot(session->ust_session,
4012 &tmp_output, session,
d07ceecd 4013 wait, nb_packets_per_stream);
a934f4af 4014 if (ret != LTTNG_OK) {
6dc3064a
DG
4015 goto error;
4016 }
804c90a8 4017 }
e1986656 4018
804c90a8
JR
4019 snapshot_success = 1;
4020 } else {
4021 struct snapshot_output *sout;
4022 struct lttng_ht_iter iter;
68808f4e 4023
804c90a8
JR
4024 rcu_read_lock();
4025 cds_lfht_for_each_entry(session->snapshot.output_ht->ht,
4026 &iter.iter, sout, node.node) {
4027 int64_t nb_packets_per_stream;
e1986656 4028
804c90a8
JR
4029 /*
4030 * Make a local copy of the output and assign the possible
4031 * temporary value given by the caller.
4032 */
4033 memset(&tmp_output, 0, sizeof(tmp_output));
4034 memcpy(&tmp_output, sout, sizeof(tmp_output));
1bfe7328 4035
804c90a8
JR
4036 if (output->max_size != (uint64_t) -1ULL) {
4037 tmp_output.max_size = output->max_size;
6dc3064a 4038 }
d07ceecd
MD
4039
4040 nb_packets_per_stream = get_session_nb_packets_per_stream(session,
4041 tmp_output.max_size);
4042 if (nb_packets_per_stream < 0) {
4043 ret = LTTNG_ERR_MAX_SIZE_INVALID;
804c90a8 4044 rcu_read_unlock();
d07ceecd
MD
4045 goto error;
4046 }
6dc3064a 4047
804c90a8
JR
4048 /* Use temporary name. */
4049 if (*output->name != '\0') {
cf3e357d
MD
4050 if (lttng_strncpy(tmp_output.name, output->name,
4051 sizeof(tmp_output.name))) {
4052 ret = LTTNG_ERR_INVALID;
4053 rcu_read_unlock();
4054 goto error;
4055 }
804c90a8 4056 }
e1986656 4057
804c90a8 4058 tmp_output.nb_snapshot = session->snapshot.nb_snapshot;
10ba83fe 4059 memcpy(tmp_output.datetime, datetime, sizeof(datetime));
e1986656 4060
804c90a8
JR
4061 if (session->kernel_session) {
4062 ret = record_kernel_snapshot(session->kernel_session,
4063 &tmp_output, session,
4064 wait, nb_packets_per_stream);
4065 if (ret != LTTNG_OK) {
d07ceecd 4066 rcu_read_unlock();
68808f4e
DG
4067 goto error;
4068 }
804c90a8 4069 }
68808f4e 4070
804c90a8
JR
4071 if (session->ust_session) {
4072 ret = record_ust_snapshot(session->ust_session,
4073 &tmp_output, session,
d07ceecd 4074 wait, nb_packets_per_stream);
a934f4af 4075 if (ret != LTTNG_OK) {
6dc3064a
DG
4076 rcu_read_unlock();
4077 goto error;
4078 }
4079 }
804c90a8 4080 snapshot_success = 1;
6dc3064a 4081 }
804c90a8 4082 rcu_read_unlock();
6dc3064a
DG
4083 }
4084
1bfe7328
DG
4085 if (snapshot_success) {
4086 session->snapshot.nb_snapshot++;
b67578cb
MD
4087 } else {
4088 ret = LTTNG_ERR_SNAPSHOT_FAIL;
1bfe7328
DG
4089 }
4090
6dc3064a 4091error:
6dc3064a
DG
4092 return ret;
4093}
4094
d7ba1388
MD
4095/*
4096 * Command LTTNG_SET_SESSION_SHM_PATH processed by the client thread.
4097 */
4098int cmd_set_session_shm_path(struct ltt_session *session,
4099 const char *shm_path)
4100{
4101 /* Safety net */
4102 assert(session);
4103
4104 /*
4105 * Can only set shm path before session is started.
4106 */
4107 if (session->has_been_started) {
4108 return LTTNG_ERR_SESSION_STARTED;
4109 }
4110
4111 strncpy(session->shm_path, shm_path,
4112 sizeof(session->shm_path));
4113 session->shm_path[sizeof(session->shm_path) - 1] = '\0';
4114
4115 return 0;
4116}
4117
2f77fc4b
DG
4118/*
4119 * Init command subsystem.
4120 */
4121void cmd_init(void)
4122{
4123 /*
d88aee68
DG
4124 * Set network sequence index to 1 for streams to match a relayd
4125 * socket on the consumer side.
2f77fc4b 4126 */
d88aee68
DG
4127 pthread_mutex_lock(&relayd_net_seq_idx_lock);
4128 relayd_net_seq_idx = 1;
4129 pthread_mutex_unlock(&relayd_net_seq_idx_lock);
2f77fc4b
DG
4130
4131 DBG("Command subsystem initialized");
4132}
This page took 0.289948 seconds and 5 git commands to generate.