lttng: reuse random_access_container_wrapper for session_list
[lttng-tools.git] / src / bin / lttng-sessiond / client.cpp
CommitLineData
917a718d 1/*
21cf9b6b 2 * Copyright (C) 2011 EfficiOS Inc.
ab5be9fa
MJ
3 * Copyright (C) 2011 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
4 * Copyright (C) 2013 Jérémie Galarneau <jeremie.galarneau@efficios.com>
917a718d 5 *
ab5be9fa 6 * SPDX-License-Identifier: GPL-2.0-only
917a718d 7 *
917a718d
JG
8 */
9
28ab034a
JG
10#include "agent-thread.hpp"
11#include "clear.hpp"
12#include "client.hpp"
13#include "cmd.hpp"
c9e313bc
SM
14#include "common/buffer-view.hpp"
15#include "common/compat/socket.hpp"
16#include "common/dynamic-array.hpp"
17#include "common/dynamic-buffer.hpp"
18#include "common/fd-handle.hpp"
19#include "common/payload-view.hpp"
20#include "common/payload.hpp"
21#include "common/sessiond-comm/sessiond-comm.hpp"
28ab034a
JG
22#include "health-sessiond.hpp"
23#include "kernel.hpp"
24#include "lttng-sessiond.hpp"
159b042f
JG
25#include "lttng/lttng-error.h"
26#include "lttng/tracker.h"
28ab034a
JG
27#include "manage-consumer.hpp"
28#include "save.hpp"
29#include "testpoint.hpp"
30#include "utils.hpp"
31
c9e313bc
SM
32#include <common/compat/getenv.hpp>
33#include <common/tracker.hpp>
34#include <common/unix.hpp>
35#include <common/utils.hpp>
28ab034a 36
c9e313bc
SM
37#include <lttng/error-query-internal.hpp>
38#include <lttng/event-internal.hpp>
39#include <lttng/session-descriptor-internal.hpp>
40#include <lttng/session-internal.hpp>
41#include <lttng/userspace-probe-internal.hpp>
28ab034a 42
671e39d7 43#include <fcntl.h>
159b042f
JG
44#include <pthread.h>
45#include <signal.h>
46#include <stddef.h>
999af9c1 47#include <stdint.h>
159b042f 48#include <sys/stat.h>
1434fd36 49#include <unistd.h>
917a718d 50
f1494934
JG
51namespace {
52bool is_root;
917a718d 53
f1494934 54struct thread_state {
6cb45e93
JG
55 sem_t ready;
56 bool running;
0f68efb6 57 int client_sock;
6cb45e93 58} thread_state;
f1494934 59} /* namespace */
6cb45e93
JG
60
61static void set_thread_status(bool running)
917a718d 62{
6cb45e93
JG
63 DBG("Marking client thread's state as %s", running ? "running" : "error");
64 thread_state.running = running;
65 sem_post(&thread_state.ready);
917a718d
JG
66}
67
cd9adb8b 68static bool wait_thread_status()
917a718d 69{
6cb45e93
JG
70 DBG("Waiting for client thread to be ready");
71 sem_wait(&thread_state.ready);
72 if (thread_state.running) {
73 DBG("Client thread is ready");
74 } else {
75 ERR("Initialization of client thread failed");
917a718d 76 }
6cb45e93
JG
77
78 return thread_state.running;
917a718d
JG
79}
80
81/*
82 * Setup the outgoing data buffer for the response (llm) by allocating the
83 * right amount of memory and copying the original information from the lsm
84 * structure.
85 *
86 * Return 0 on success, negative value on error.
87 */
88static int setup_lttng_msg(struct command_ctx *cmd_ctx,
28ab034a
JG
89 const void *payload_buf,
90 size_t payload_len,
91 const void *cmd_header_buf,
92 size_t cmd_header_len)
917a718d
JG
93{
94 int ret = 0;
95 const size_t header_len = sizeof(struct lttcomm_lttng_msg);
917a718d 96 const size_t total_msg_size = header_len + cmd_header_len + payload_len;
28ab034a 97 lttcomm_lttng_msg llm{};
7966af57
SM
98
99 llm.cmd_type = cmd_ctx->lsm.cmd_type;
100 llm.pid = (uint32_t) cmd_ctx->lsm.domain.attr.pid;
101 llm.cmd_header_size = (uint32_t) cmd_header_len;
102 llm.data_size = (uint32_t) payload_len;
917a718d 103
2eb1b01f
JR
104 ret = lttng_dynamic_buffer_set_size(&cmd_ctx->reply_payload.buffer, 0);
105 if (ret) {
106 goto end;
107 }
108
fe489250 109 lttng_dynamic_pointer_array_clear(&cmd_ctx->reply_payload._fd_handles);
917a718d 110
3a91de3a
JG
111 cmd_ctx->lttng_msg_size = total_msg_size;
112
113 /* Append reply header. */
28ab034a 114 ret = lttng_dynamic_buffer_append(&cmd_ctx->reply_payload.buffer, &llm, sizeof(llm));
3a91de3a 115 if (ret) {
917a718d
JG
116 goto end;
117 }
118
3a91de3a 119 /* Append command header. */
917a718d 120 if (cmd_header_len) {
3a91de3a 121 ret = lttng_dynamic_buffer_append(
28ab034a 122 &cmd_ctx->reply_payload.buffer, cmd_header_buf, cmd_header_len);
3a91de3a
JG
123 if (ret) {
124 goto end;
125 }
917a718d
JG
126 }
127
3a91de3a 128 /* Append payload. */
917a718d 129 if (payload_len) {
3a91de3a 130 ret = lttng_dynamic_buffer_append(
28ab034a 131 &cmd_ctx->reply_payload.buffer, payload_buf, payload_len);
3a91de3a
JG
132 if (ret) {
133 goto end;
134 }
917a718d
JG
135 }
136
137end:
138 return ret;
139}
140
e368fb43
JG
141static int setup_empty_lttng_msg(struct command_ctx *cmd_ctx)
142{
143 int ret;
144 const struct lttcomm_lttng_msg llm = {};
145
64defc29
JR
146 ret = lttng_dynamic_buffer_set_size(&cmd_ctx->reply_payload.buffer, 0);
147 if (ret) {
148 goto end;
149 }
e368fb43
JG
150
151 /* Append place-holder reply header. */
28ab034a 152 ret = lttng_dynamic_buffer_append(&cmd_ctx->reply_payload.buffer, &llm, sizeof(llm));
e368fb43
JG
153 if (ret) {
154 goto end;
155 }
156
157 cmd_ctx->lttng_msg_size = sizeof(llm);
158end:
159 return ret;
160}
161
28ab034a 162static void update_lttng_msg(struct command_ctx *cmd_ctx, size_t cmd_header_len, size_t payload_len)
e368fb43
JG
163{
164 const size_t header_len = sizeof(struct lttcomm_lttng_msg);
165 const size_t total_msg_size = header_len + cmd_header_len + payload_len;
e368fb43 166 struct lttcomm_lttng_msg *p_llm;
28ab034a 167 lttcomm_lttng_msg llm{};
7966af57
SM
168
169 llm.cmd_type = cmd_ctx->lsm.cmd_type;
170 llm.pid = (uint32_t) cmd_ctx->lsm.domain.attr.pid;
171 llm.cmd_header_size = (uint32_t) cmd_header_len;
172 llm.data_size = (uint32_t) payload_len;
e368fb43 173
a0377dfe 174 LTTNG_ASSERT(cmd_ctx->reply_payload.buffer.size >= sizeof(llm));
e368fb43
JG
175
176 p_llm = (typeof(p_llm)) cmd_ctx->reply_payload.buffer.data;
177
178 /* Update existing header. */
179 memcpy(p_llm, &llm, sizeof(llm));
180
181 cmd_ctx->lttng_msg_size = total_msg_size;
182}
183
917a718d
JG
184/*
185 * Start the thread_manage_consumer. This must be done after a lttng-consumerd
4ec029ed 186 * exec or it will fail.
917a718d
JG
187 */
188static int spawn_consumer_thread(struct consumer_data *consumer_data)
189{
4ec029ed 190 return launch_consumer_management_thread(consumer_data) ? 0 : -1;
917a718d
JG
191}
192
193/*
194 * Fork and exec a consumer daemon (consumerd).
195 *
196 * Return pid if successful else -1.
197 */
198static pid_t spawn_consumerd(struct consumer_data *consumer_data)
199{
200 int ret;
201 pid_t pid;
202 const char *consumer_to_use;
203 const char *verbosity;
204 struct stat st;
205
206 DBG("Spawning consumerd");
207
208 pid = fork();
209 if (pid == 0) {
210 /*
211 * Exec consumerd.
212 */
412d7227 213 if (the_config.verbose_consumer) {
917a718d
JG
214 verbosity = "--verbose";
215 } else if (lttng_opt_quiet) {
216 verbosity = "--quiet";
217 } else {
218 verbosity = "";
219 }
220
221 switch (consumer_data->type) {
222 case LTTNG_CONSUMER_KERNEL:
223 /*
224 * Find out which consumerd to execute. We will first try the
225 * 64-bit path, then the sessiond's installation directory, and
226 * fallback on the 32-bit one,
227 */
228 DBG3("Looking for a kernel consumer at these locations:");
28ab034a 229 DBG3(" 1) %s", the_config.consumerd64_bin_path.value ?: "NULL");
917a718d 230 DBG3(" 2) %s/%s", INSTALL_BIN_PATH, DEFAULT_CONSUMERD_FILE);
28ab034a 231 DBG3(" 3) %s", the_config.consumerd32_bin_path.value ?: "NULL");
412d7227 232 if (stat(the_config.consumerd64_bin_path.value, &st) == 0) {
917a718d 233 DBG3("Found location #1");
412d7227 234 consumer_to_use = the_config.consumerd64_bin_path.value;
917a718d
JG
235 } else if (stat(INSTALL_BIN_PATH "/" DEFAULT_CONSUMERD_FILE, &st) == 0) {
236 DBG3("Found location #2");
237 consumer_to_use = INSTALL_BIN_PATH "/" DEFAULT_CONSUMERD_FILE;
412d7227 238 } else if (the_config.consumerd32_bin_path.value &&
28ab034a 239 stat(the_config.consumerd32_bin_path.value, &st) == 0) {
917a718d 240 DBG3("Found location #3");
412d7227 241 consumer_to_use = the_config.consumerd32_bin_path.value;
917a718d
JG
242 } else {
243 DBG("Could not find any valid consumerd executable");
244 ret = -EINVAL;
245 goto error;
246 }
28ab034a
JG
247 DBG("Using kernel consumer at: %s", consumer_to_use);
248 (void) execl(consumer_to_use,
249 "lttng-consumerd",
250 verbosity,
251 "-k",
252 "--consumerd-cmd-sock",
253 consumer_data->cmd_unix_sock_path,
254 "--consumerd-err-sock",
255 consumer_data->err_unix_sock_path,
256 "--group",
257 the_config.tracing_group_name.value,
258 NULL);
917a718d
JG
259 break;
260 case LTTNG_CONSUMER64_UST:
261 {
412d7227 262 if (the_config.consumerd64_lib_dir.value) {
b53d4e59 263 const char *tmp;
917a718d
JG
264 size_t tmplen;
265 char *tmpnew;
266
267 tmp = lttng_secure_getenv("LD_LIBRARY_PATH");
268 if (!tmp) {
269 tmp = "";
270 }
28ab034a
JG
271 tmplen = strlen(the_config.consumerd64_lib_dir.value) + 1 /* : */ +
272 strlen(tmp);
64803277 273 tmpnew = zmalloc<char>(tmplen + 1 /* \0 */);
917a718d
JG
274 if (!tmpnew) {
275 ret = -ENOMEM;
276 goto error;
277 }
412d7227 278 strcat(tmpnew, the_config.consumerd64_lib_dir.value);
917a718d
JG
279 if (tmp[0] != '\0') {
280 strcat(tmpnew, ":");
281 strcat(tmpnew, tmp);
282 }
283 ret = setenv("LD_LIBRARY_PATH", tmpnew, 1);
284 free(tmpnew);
285 if (ret) {
286 ret = -errno;
287 goto error;
288 }
289 }
412d7227 290 DBG("Using 64-bit UST consumer at: %s",
28ab034a 291 the_config.consumerd64_bin_path.value);
412d7227 292 (void) execl(the_config.consumerd64_bin_path.value,
28ab034a
JG
293 "lttng-consumerd",
294 verbosity,
295 "-u",
296 "--consumerd-cmd-sock",
297 consumer_data->cmd_unix_sock_path,
298 "--consumerd-err-sock",
299 consumer_data->err_unix_sock_path,
300 "--group",
301 the_config.tracing_group_name.value,
302 NULL);
917a718d
JG
303 break;
304 }
305 case LTTNG_CONSUMER32_UST:
306 {
412d7227 307 if (the_config.consumerd32_lib_dir.value) {
b53d4e59 308 const char *tmp;
917a718d
JG
309 size_t tmplen;
310 char *tmpnew;
311
312 tmp = lttng_secure_getenv("LD_LIBRARY_PATH");
313 if (!tmp) {
314 tmp = "";
315 }
28ab034a
JG
316 tmplen = strlen(the_config.consumerd32_lib_dir.value) + 1 /* : */ +
317 strlen(tmp);
64803277 318 tmpnew = zmalloc<char>(tmplen + 1 /* \0 */);
917a718d
JG
319 if (!tmpnew) {
320 ret = -ENOMEM;
321 goto error;
322 }
412d7227 323 strcat(tmpnew, the_config.consumerd32_lib_dir.value);
917a718d
JG
324 if (tmp[0] != '\0') {
325 strcat(tmpnew, ":");
326 strcat(tmpnew, tmp);
327 }
328 ret = setenv("LD_LIBRARY_PATH", tmpnew, 1);
329 free(tmpnew);
330 if (ret) {
331 ret = -errno;
332 goto error;
333 }
334 }
412d7227 335 DBG("Using 32-bit UST consumer at: %s",
28ab034a 336 the_config.consumerd32_bin_path.value);
412d7227 337 (void) execl(the_config.consumerd32_bin_path.value,
28ab034a
JG
338 "lttng-consumerd",
339 verbosity,
340 "-u",
341 "--consumerd-cmd-sock",
342 consumer_data->cmd_unix_sock_path,
343 "--consumerd-err-sock",
344 consumer_data->err_unix_sock_path,
345 "--group",
346 the_config.tracing_group_name.value,
347 NULL);
917a718d
JG
348 break;
349 }
350 default:
351 ERR("unknown consumer type");
352 errno = 0;
353 }
354 if (errno != 0) {
355 PERROR("Consumer execl()");
356 }
357 /* Reaching this point, we got a failure on our execl(). */
358 exit(EXIT_FAILURE);
359 } else if (pid > 0) {
360 ret = pid;
361 } else {
362 PERROR("start consumer fork");
363 ret = -errno;
364 }
365error:
366 return ret;
367}
368
369/*
370 * Spawn the consumerd daemon and session daemon thread.
371 */
372static int start_consumerd(struct consumer_data *consumer_data)
373{
374 int ret;
375
376 /*
377 * Set the listen() state on the socket since there is a possible race
378 * between the exec() of the consumer daemon and this call if place in the
379 * consumer thread. See bug #366 for more details.
380 */
381 ret = lttcomm_listen_unix_sock(consumer_data->err_sock);
382 if (ret < 0) {
383 goto error;
384 }
385
386 pthread_mutex_lock(&consumer_data->pid_mutex);
387 if (consumer_data->pid != 0) {
388 pthread_mutex_unlock(&consumer_data->pid_mutex);
389 goto end;
390 }
391
392 ret = spawn_consumerd(consumer_data);
393 if (ret < 0) {
394 ERR("Spawning consumerd failed");
395 pthread_mutex_unlock(&consumer_data->pid_mutex);
396 goto error;
397 }
398
399 /* Setting up the consumer_data pid */
400 consumer_data->pid = ret;
401 DBG2("Consumer pid %d", consumer_data->pid);
402 pthread_mutex_unlock(&consumer_data->pid_mutex);
403
404 DBG2("Spawning consumer control thread");
405 ret = spawn_consumer_thread(consumer_data);
406 if (ret < 0) {
407 ERR("Fatal error spawning consumer control thread");
408 goto error;
409 }
410
411end:
412 return 0;
413
414error:
415 /* Cleanup already created sockets on error. */
416 if (consumer_data->err_sock >= 0) {
417 int err;
418
419 err = close(consumer_data->err_sock);
420 if (err < 0) {
421 PERROR("close consumer data error socket");
422 }
423 }
424 return ret;
425}
426
427/*
428 * Copy consumer output from the tracing session to the domain session. The
429 * function also applies the right modification on a per domain basis for the
430 * trace files destination directory.
917a718d
JG
431 */
432static int copy_session_consumer(int domain, struct ltt_session *session)
433{
434 int ret;
435 const char *dir_name;
436 struct consumer_output *consumer;
437
a0377dfe
FD
438 LTTNG_ASSERT(session);
439 LTTNG_ASSERT(session->consumer);
917a718d
JG
440
441 switch (domain) {
442 case LTTNG_DOMAIN_KERNEL:
443 DBG3("Copying tracing session consumer output in kernel session");
444 /*
445 * XXX: We should audit the session creation and what this function
446 * does "extra" in order to avoid a destroy since this function is used
447 * in the domain session creation (kernel and ust) only. Same for UST
448 * domain.
449 */
450 if (session->kernel_session->consumer) {
451 consumer_output_put(session->kernel_session->consumer);
452 }
28ab034a 453 session->kernel_session->consumer = consumer_copy_output(session->consumer);
917a718d
JG
454 /* Ease our life a bit for the next part */
455 consumer = session->kernel_session->consumer;
456 dir_name = DEFAULT_KERNEL_TRACE_DIR;
457 break;
458 case LTTNG_DOMAIN_JUL:
459 case LTTNG_DOMAIN_LOG4J:
460 case LTTNG_DOMAIN_PYTHON:
461 case LTTNG_DOMAIN_UST:
462 DBG3("Copying tracing session consumer output in UST session");
463 if (session->ust_session->consumer) {
464 consumer_output_put(session->ust_session->consumer);
465 }
28ab034a 466 session->ust_session->consumer = consumer_copy_output(session->consumer);
917a718d
JG
467 /* Ease our life a bit for the next part */
468 consumer = session->ust_session->consumer;
469 dir_name = DEFAULT_UST_TRACE_DIR;
470 break;
471 default:
472 ret = LTTNG_ERR_UNKNOWN_DOMAIN;
473 goto error;
474 }
475
476 /* Append correct directory to subdir */
28ab034a 477 ret = lttng_strncpy(consumer->domain_subdir, dir_name, sizeof(consumer->domain_subdir));
b178f53e
JG
478 if (ret) {
479 ret = LTTNG_ERR_UNK;
480 goto error;
481 }
482 DBG3("Copy session consumer subdir %s", consumer->domain_subdir);
917a718d
JG
483 ret = LTTNG_OK;
484
485error:
486 return ret;
487}
488
489/*
490 * Create an UST session and add it to the session ust list.
917a718d 491 */
28ab034a 492static int create_ust_session(struct ltt_session *session, const struct lttng_domain *domain)
917a718d
JG
493{
494 int ret;
cd9adb8b 495 struct ltt_ust_session *lus = nullptr;
917a718d 496
a0377dfe
FD
497 LTTNG_ASSERT(session);
498 LTTNG_ASSERT(domain);
499 LTTNG_ASSERT(session->consumer);
917a718d
JG
500
501 switch (domain->type) {
502 case LTTNG_DOMAIN_JUL:
503 case LTTNG_DOMAIN_LOG4J:
504 case LTTNG_DOMAIN_PYTHON:
505 case LTTNG_DOMAIN_UST:
506 break;
507 default:
508 ERR("Unknown UST domain on create session %d", domain->type);
509 ret = LTTNG_ERR_UNKNOWN_DOMAIN;
510 goto error;
511 }
512
513 DBG("Creating UST session");
514
515 lus = trace_ust_create_session(session->id);
cd9adb8b 516 if (lus == nullptr) {
917a718d
JG
517 ret = LTTNG_ERR_UST_SESS_FAIL;
518 goto error;
519 }
520
521 lus->uid = session->uid;
522 lus->gid = session->gid;
523 lus->output_traces = session->output_traces;
524 lus->snapshot_mode = session->snapshot_mode;
525 lus->live_timer_interval = session->live_timer;
526 session->ust_session = lus;
527 if (session->shm_path[0]) {
28ab034a 528 strncpy(lus->root_shm_path, session->shm_path, sizeof(lus->root_shm_path));
917a718d 529 lus->root_shm_path[sizeof(lus->root_shm_path) - 1] = '\0';
28ab034a 530 strncpy(lus->shm_path, session->shm_path, sizeof(lus->shm_path));
917a718d 531 lus->shm_path[sizeof(lus->shm_path) - 1] = '\0';
28ab034a 532 strncat(lus->shm_path, "/ust", sizeof(lus->shm_path) - strlen(lus->shm_path) - 1);
917a718d
JG
533 }
534 /* Copy session output to the newly created UST session */
535 ret = copy_session_consumer(domain->type, session);
536 if (ret != LTTNG_OK) {
537 goto error;
538 }
539
540 return LTTNG_OK;
541
542error:
543 free(lus);
cd9adb8b 544 session->ust_session = nullptr;
917a718d
JG
545 return ret;
546}
547
548/*
549 * Create a kernel tracer session then create the default channel.
550 */
551static int create_kernel_session(struct ltt_session *session)
552{
553 int ret;
554
555 DBG("Creating kernel session");
556
7d268848 557 ret = kernel_create_session(session);
917a718d
JG
558 if (ret < 0) {
559 ret = LTTNG_ERR_KERN_SESS_FAIL;
5d0a7bcb 560 goto error_create;
917a718d
JG
561 }
562
563 /* Code flow safety */
a0377dfe 564 LTTNG_ASSERT(session->kernel_session);
917a718d
JG
565
566 /* Copy session output to the newly created Kernel session */
567 ret = copy_session_consumer(LTTNG_DOMAIN_KERNEL, session);
568 if (ret != LTTNG_OK) {
569 goto error;
570 }
571
572 session->kernel_session->uid = session->uid;
573 session->kernel_session->gid = session->gid;
574 session->kernel_session->output_traces = session->output_traces;
575 session->kernel_session->snapshot_mode = session->snapshot_mode;
a2814ea7 576 session->kernel_session->is_live_session = session->live_timer != 0;
917a718d
JG
577
578 return LTTNG_OK;
579
580error:
581 trace_kernel_destroy_session(session->kernel_session);
cd9adb8b 582 session->kernel_session = nullptr;
5d0a7bcb 583error_create:
917a718d
JG
584 return ret;
585}
586
587/*
588 * Count number of session permitted by uid/gid.
589 */
28ab034a 590static unsigned int lttng_sessions_count(uid_t uid, gid_t gid __attribute__((unused)))
917a718d
JG
591{
592 unsigned int i = 0;
593 struct ltt_session *session;
594 const struct ltt_session_list *session_list = session_get_list();
595
d7b377ed 596 DBG("Counting number of available session for UID %d", uid);
28ab034a 597 cds_list_for_each_entry (session, &session_list->head, list) {
917a718d
JG
598 if (!session_get(session)) {
599 continue;
600 }
601 session_lock(session);
602 /* Only count the sessions the user can control. */
28ab034a 603 if (session_access_ok(session, uid) && !session->destroyed) {
917a718d
JG
604 i++;
605 }
606 session_unlock(session);
607 session_put(session);
608 }
609 return i;
610}
611
746e08d7 612static enum lttng_error_code receive_lttng_trigger(struct command_ctx *cmd_ctx,
28ab034a
JG
613 int sock,
614 int *sock_error,
615 struct lttng_trigger **_trigger)
746e08d7
JG
616{
617 int ret;
618 size_t trigger_len;
619 ssize_t sock_recv_len;
620 enum lttng_error_code ret_code;
621 struct lttng_payload trigger_payload;
cd9adb8b 622 struct lttng_trigger *trigger = nullptr;
746e08d7
JG
623
624 lttng_payload_init(&trigger_payload);
625 trigger_len = (size_t) cmd_ctx->lsm.u.trigger.length;
28ab034a 626 ret = lttng_dynamic_buffer_set_size(&trigger_payload.buffer, trigger_len);
746e08d7
JG
627 if (ret) {
628 ret_code = LTTNG_ERR_NOMEM;
629 goto end;
630 }
631
28ab034a 632 sock_recv_len = lttcomm_recv_unix_sock(sock, trigger_payload.buffer.data, trigger_len);
746e08d7
JG
633 if (sock_recv_len < 0 || sock_recv_len != trigger_len) {
634 ERR("Failed to receive trigger in command payload");
635 *sock_error = 1;
636 ret_code = LTTNG_ERR_INVALID_PROTOCOL;
637 goto end;
638 }
639
640 /* Receive fds, if any. */
641 if (cmd_ctx->lsm.fd_count > 0) {
642 sock_recv_len = lttcomm_recv_payload_fds_unix_sock(
28ab034a
JG
643 sock, cmd_ctx->lsm.fd_count, &trigger_payload);
644 if (sock_recv_len > 0 && sock_recv_len != cmd_ctx->lsm.fd_count * sizeof(int)) {
746e08d7 645 ERR("Failed to receive all file descriptors for trigger in command payload: expected fd count = %u, ret = %d",
28ab034a
JG
646 cmd_ctx->lsm.fd_count,
647 (int) ret);
746e08d7
JG
648 ret_code = LTTNG_ERR_INVALID_PROTOCOL;
649 *sock_error = 1;
650 goto end;
651 } else if (sock_recv_len <= 0) {
652 ERR("Failed to receive file descriptors for trigger in command payload: expected fd count = %u, ret = %d",
28ab034a
JG
653 cmd_ctx->lsm.fd_count,
654 (int) ret);
746e08d7
JG
655 ret_code = LTTNG_ERR_FATAL;
656 *sock_error = 1;
657 goto end;
658 }
659 }
660
661 /* Deserialize trigger. */
662 {
663 struct lttng_payload_view view =
28ab034a 664 lttng_payload_view_from_payload(&trigger_payload, 0, -1);
746e08d7 665
28ab034a 666 if (lttng_trigger_create_from_payload(&view, &trigger) != trigger_len) {
746e08d7
JG
667 ERR("Invalid trigger received as part of command payload");
668 ret_code = LTTNG_ERR_INVALID_TRIGGER;
b5ef1685 669 lttng_trigger_put(trigger);
746e08d7
JG
670 goto end;
671 }
672 }
673
674 *_trigger = trigger;
675 ret_code = LTTNG_OK;
676
677end:
bae46a81 678 lttng_payload_reset(&trigger_payload);
746e08d7
JG
679 return ret_code;
680}
681
588c4b0d 682static enum lttng_error_code receive_lttng_error_query(struct command_ctx *cmd_ctx,
28ab034a
JG
683 int sock,
684 int *sock_error,
685 struct lttng_error_query **_query)
588c4b0d
JG
686{
687 int ret;
688 size_t query_len;
689 ssize_t sock_recv_len;
690 enum lttng_error_code ret_code;
691 struct lttng_payload query_payload;
cd9adb8b 692 struct lttng_error_query *query = nullptr;
588c4b0d
JG
693
694 lttng_payload_init(&query_payload);
695 query_len = (size_t) cmd_ctx->lsm.u.error_query.length;
696 ret = lttng_dynamic_buffer_set_size(&query_payload.buffer, query_len);
697 if (ret) {
698 ret_code = LTTNG_ERR_NOMEM;
699 goto end;
700 }
701
28ab034a 702 sock_recv_len = lttcomm_recv_unix_sock(sock, query_payload.buffer.data, query_len);
588c4b0d
JG
703 if (sock_recv_len < 0 || sock_recv_len != query_len) {
704 ERR("Failed to receive error query in command payload");
705 *sock_error = 1;
706 ret_code = LTTNG_ERR_INVALID_PROTOCOL;
707 goto end;
708 }
709
710 /* Receive fds, if any. */
711 if (cmd_ctx->lsm.fd_count > 0) {
712 sock_recv_len = lttcomm_recv_payload_fds_unix_sock(
28ab034a
JG
713 sock, cmd_ctx->lsm.fd_count, &query_payload);
714 if (sock_recv_len > 0 && sock_recv_len != cmd_ctx->lsm.fd_count * sizeof(int)) {
588c4b0d 715 ERR("Failed to receive all file descriptors for error query in command payload: expected fd count = %u, ret = %d",
28ab034a
JG
716 cmd_ctx->lsm.fd_count,
717 (int) ret);
588c4b0d
JG
718 ret_code = LTTNG_ERR_INVALID_PROTOCOL;
719 *sock_error = 1;
720 goto end;
721 } else if (sock_recv_len <= 0) {
722 ERR("Failed to receive file descriptors for error query in command payload: expected fd count = %u, ret = %d",
28ab034a
JG
723 cmd_ctx->lsm.fd_count,
724 (int) ret);
588c4b0d
JG
725 ret_code = LTTNG_ERR_FATAL;
726 *sock_error = 1;
727 goto end;
728 }
729 }
730
731 /* Deserialize error query. */
732 {
733 struct lttng_payload_view view =
28ab034a 734 lttng_payload_view_from_payload(&query_payload, 0, -1);
588c4b0d 735
28ab034a 736 if (lttng_error_query_create_from_payload(&view, &query) != query_len) {
588c4b0d
JG
737 ERR("Invalid error query received as part of command payload");
738 ret_code = LTTNG_ERR_INVALID_PROTOCOL;
739 goto end;
740 }
741 }
742
743 *_query = query;
744 ret_code = LTTNG_OK;
745
746end:
747 lttng_payload_reset(&query_payload);
748 return ret_code;
749}
750
8ddd72ef 751static enum lttng_error_code receive_lttng_event(struct command_ctx *cmd_ctx,
28ab034a
JG
752 int sock,
753 int *sock_error,
754 struct lttng_event **out_event,
755 char **out_filter_expression,
756 struct lttng_bytecode **out_bytecode,
757 struct lttng_event_exclusion **out_exclusion)
8ddd72ef
JR
758{
759 int ret;
760 size_t event_len;
761 ssize_t sock_recv_len;
762 enum lttng_error_code ret_code;
763 struct lttng_payload event_payload;
cd9adb8b
JG
764 struct lttng_event *local_event = nullptr;
765 char *local_filter_expression = nullptr;
766 struct lttng_bytecode *local_bytecode = nullptr;
767 struct lttng_event_exclusion *local_exclusion = nullptr;
8ddd72ef
JR
768
769 lttng_payload_init(&event_payload);
37a5ef39 770 if (cmd_ctx->lsm.cmd_type == LTTCOMM_SESSIOND_COMMAND_ENABLE_EVENT) {
8ddd72ef 771 event_len = (size_t) cmd_ctx->lsm.u.enable.length;
37a5ef39 772 } else if (cmd_ctx->lsm.cmd_type == LTTCOMM_SESSIOND_COMMAND_DISABLE_EVENT) {
8ddd72ef
JR
773 event_len = (size_t) cmd_ctx->lsm.u.disable.length;
774 } else {
775 abort();
776 }
777
778 ret = lttng_dynamic_buffer_set_size(&event_payload.buffer, event_len);
779 if (ret) {
780 ret_code = LTTNG_ERR_NOMEM;
781 goto end;
782 }
783
28ab034a 784 sock_recv_len = lttcomm_recv_unix_sock(sock, event_payload.buffer.data, event_len);
8ddd72ef
JR
785 if (sock_recv_len < 0 || sock_recv_len != event_len) {
786 ERR("Failed to receive event in command payload");
787 *sock_error = 1;
788 ret_code = LTTNG_ERR_INVALID_PROTOCOL;
789 goto end;
790 }
791
792 /* Receive fds, if any. */
793 if (cmd_ctx->lsm.fd_count > 0) {
794 sock_recv_len = lttcomm_recv_payload_fds_unix_sock(
28ab034a
JG
795 sock, cmd_ctx->lsm.fd_count, &event_payload);
796 if (sock_recv_len > 0 && sock_recv_len != cmd_ctx->lsm.fd_count * sizeof(int)) {
8ddd72ef 797 ERR("Failed to receive all file descriptors for event in command payload: expected fd count = %u, ret = %d",
28ab034a
JG
798 cmd_ctx->lsm.fd_count,
799 (int) ret);
8ddd72ef
JR
800 ret_code = LTTNG_ERR_INVALID_PROTOCOL;
801 *sock_error = 1;
802 goto end;
803 } else if (sock_recv_len <= 0) {
804 ERR("Failed to receive file descriptors for event in command payload: expected fd count = %u, ret = %d",
28ab034a
JG
805 cmd_ctx->lsm.fd_count,
806 (int) ret);
8ddd72ef
JR
807 ret_code = LTTNG_ERR_FATAL;
808 *sock_error = 1;
809 goto end;
810 }
811 }
812
813 /* Deserialize event. */
814 {
9610c0c5 815 ssize_t len;
8ddd72ef 816 struct lttng_payload_view event_view =
28ab034a 817 lttng_payload_view_from_payload(&event_payload, 0, -1);
8ddd72ef 818
28ab034a
JG
819 len = lttng_event_create_from_payload(&event_view,
820 &local_event,
821 &local_exclusion,
822 &local_filter_expression,
823 &local_bytecode);
9610c0c5
JR
824
825 if (len < 0) {
826 ERR("Failed to create an event from the received buffer");
827 ret_code = LTTNG_ERR_INVALID_PROTOCOL;
828 goto end;
829 }
830
831 if (len != event_len) {
28ab034a
JG
832 ERR("Userspace probe location from the received buffer is not the advertised length: header length = %zu" PRIu32
833 ", payload length = %zd",
834 event_len,
835 len);
8ddd72ef
JR
836 ret_code = LTTNG_ERR_INVALID_PROTOCOL;
837 goto end;
838 }
839 }
840
9610c0c5
JR
841 *out_event = local_event;
842 *out_exclusion = local_exclusion;
843 *out_filter_expression = local_filter_expression;
844 *out_bytecode = local_bytecode;
cd9adb8b
JG
845 local_event = nullptr;
846 local_exclusion = nullptr;
847 local_filter_expression = nullptr;
848 local_bytecode = nullptr;
9610c0c5 849
8ddd72ef
JR
850 ret_code = LTTNG_OK;
851
852end:
853 lttng_payload_reset(&event_payload);
9610c0c5
JR
854 lttng_event_destroy(local_event);
855 free(local_filter_expression);
856 free(local_bytecode);
857 free(local_exclusion);
8ddd72ef
JR
858 return ret_code;
859}
860
28ab034a
JG
861static enum lttng_error_code
862receive_lttng_event_context(const struct command_ctx *cmd_ctx,
863 int sock,
864 int *sock_error,
865 struct lttng_event_context **out_event_context)
26e1c61f
JR
866{
867 int ret;
28ab034a 868 const size_t event_context_len = (size_t) cmd_ctx->lsm.u.context.length;
26e1c61f
JR
869 ssize_t sock_recv_len;
870 enum lttng_error_code ret_code;
871 struct lttng_payload event_context_payload;
cd9adb8b 872 struct lttng_event_context *context = nullptr;
26e1c61f
JR
873
874 lttng_payload_init(&event_context_payload);
875
28ab034a 876 ret = lttng_dynamic_buffer_set_size(&event_context_payload.buffer, event_context_len);
26e1c61f
JR
877 if (ret) {
878 ret_code = LTTNG_ERR_NOMEM;
879 goto end;
880 }
881
28ab034a
JG
882 sock_recv_len =
883 lttcomm_recv_unix_sock(sock, event_context_payload.buffer.data, event_context_len);
26e1c61f
JR
884 if (sock_recv_len < 0 || sock_recv_len != event_context_len) {
885 ERR("Failed to receive event context in command payload");
886 *sock_error = 1;
887 ret_code = LTTNG_ERR_INVALID_PROTOCOL;
888 goto end;
889 }
890
891 /* Deserialize event. */
892 {
129d59f5 893 ssize_t len;
26e1c61f 894 struct lttng_payload_view event_context_view =
28ab034a 895 lttng_payload_view_from_payload(&event_context_payload, 0, -1);
26e1c61f 896
28ab034a 897 len = lttng_event_context_create_from_payload(&event_context_view, &context);
129d59f5
JR
898
899 if (len < 0) {
900 ERR("Failed to create a event context from the received buffer");
901 ret_code = LTTNG_ERR_INVALID_PROTOCOL;
902 goto end;
903 }
904
905 if (len != event_context_len) {
28ab034a
JG
906 ERR("Event context from the received buffer is not the advertised length: expected length = %zu, payload length = %zd",
907 event_context_len,
908 len);
26e1c61f
JR
909 ret_code = LTTNG_ERR_INVALID_PROTOCOL;
910 goto end;
911 }
912 }
913
129d59f5 914 *out_event_context = context;
cd9adb8b 915 context = nullptr;
26e1c61f
JR
916 ret_code = LTTNG_OK;
917
918end:
129d59f5 919 lttng_event_context_destroy(context);
26e1c61f
JR
920 lttng_payload_reset(&event_context_payload);
921 return ret_code;
922}
923
917a718d
JG
924/*
925 * Version of setup_lttng_msg() without command header.
926 */
28ab034a
JG
927static int
928setup_lttng_msg_no_cmd_header(struct command_ctx *cmd_ctx, void *payload_buf, size_t payload_len)
917a718d 929{
cd9adb8b 930 return setup_lttng_msg(cmd_ctx, payload_buf, payload_len, nullptr, 0);
917a718d
JG
931}
932
917a718d
JG
933/*
934 * Check if the current kernel tracer supports the session rotation feature.
935 * Return 1 if it does, 0 otherwise.
936 */
cd9adb8b 937static int check_rotate_compatible()
917a718d
JG
938{
939 int ret = 1;
940
28ab034a 941 if (the_kernel_tracer_version.major != 2 || the_kernel_tracer_version.minor < 11) {
917a718d
JG
942 DBG("Kernel tracer version is not compatible with the rotation feature");
943 ret = 0;
944 }
945
946 return ret;
947}
948
949/*
950 * Send data on a unix socket using the liblttsessiondcomm API.
951 *
952 * Return lttcomm error code.
953 */
3a91de3a 954static int send_unix_sock(int sock, struct lttng_payload_view *view)
917a718d 955{
3a91de3a 956 int ret;
fe489250 957 const int fd_count = lttng_payload_view_get_fd_handle_count(view);
3a91de3a 958
917a718d 959 /* Check valid length */
3a91de3a
JG
960 if (view->buffer.size == 0) {
961 ret = -1;
962 goto end;
963 }
964
28ab034a 965 ret = lttcomm_send_unix_sock(sock, view->buffer.data, view->buffer.size);
3a91de3a
JG
966 if (ret < 0) {
967 goto end;
917a718d
JG
968 }
969
fe489250 970 if (fd_count > 0) {
700741dc
JG
971 ret = lttcomm_send_payload_view_fds_unix_sock(sock, view);
972 if (ret < 0) {
973 goto end;
fe489250 974 }
3a91de3a
JG
975 }
976
977end:
978 return ret;
917a718d
JG
979}
980
981/*
982 * Process the command requested by the lttng client within the command
983 * context structure. This function make sure that the return structure (llm)
984 * is set and ready for transmission before returning.
985 *
986 * Return any error encountered or 0 for success.
987 *
988 * "sock" is only used for special-case var. len data.
3e3665b8
JG
989 * A command may assume the ownership of the socket, in which case its value
990 * should be set to -1.
917a718d 991 */
28ab034a 992static int process_client_msg(struct command_ctx *cmd_ctx, int *sock, int *sock_error)
917a718d
JG
993{
994 int ret = LTTNG_OK;
9124c630
JR
995 bool need_tracing_session = true;
996 bool need_domain;
997 bool need_consumerd;
917a718d 998
6c1db447
JG
999 if (!lttcomm_sessiond_command_is_valid((lttcomm_sessiond_command) cmd_ctx->lsm.cmd_type)) {
1000 ERR("Unknown client command received: command id = %" PRIu32,
28ab034a 1001 cmd_ctx->lsm.cmd_type);
6c1db447
JG
1002 ret = LTTNG_ERR_UND;
1003 goto error;
1004 }
1005
19f912db 1006 DBG("Processing client command '%s\' (%d)",
28ab034a
JG
1007 lttcomm_sessiond_command_str((lttcomm_sessiond_command) cmd_ctx->lsm.cmd_type),
1008 cmd_ctx->lsm.cmd_type);
917a718d 1009
917a718d
JG
1010 *sock_error = 0;
1011
3a91de3a 1012 switch (cmd_ctx->lsm.cmd_type) {
37a5ef39
JG
1013 case LTTCOMM_SESSIOND_COMMAND_CREATE_SESSION_EXT:
1014 case LTTCOMM_SESSIOND_COMMAND_DESTROY_SESSION:
1015 case LTTCOMM_SESSIOND_COMMAND_LIST_SESSIONS:
1016 case LTTCOMM_SESSIOND_COMMAND_LIST_DOMAINS:
1017 case LTTCOMM_SESSIOND_COMMAND_START_TRACE:
1018 case LTTCOMM_SESSIOND_COMMAND_STOP_TRACE:
1019 case LTTCOMM_SESSIOND_COMMAND_DATA_PENDING:
1020 case LTTCOMM_SESSIOND_COMMAND_SNAPSHOT_ADD_OUTPUT:
1021 case LTTCOMM_SESSIOND_COMMAND_SNAPSHOT_DEL_OUTPUT:
1022 case LTTCOMM_SESSIOND_COMMAND_SNAPSHOT_LIST_OUTPUT:
1023 case LTTCOMM_SESSIOND_COMMAND_SNAPSHOT_RECORD:
1024 case LTTCOMM_SESSIOND_COMMAND_SAVE_SESSION:
1025 case LTTCOMM_SESSIOND_COMMAND_SET_SESSION_SHM_PATH:
1026 case LTTCOMM_SESSIOND_COMMAND_REGENERATE_METADATA:
1027 case LTTCOMM_SESSIOND_COMMAND_REGENERATE_STATEDUMP:
1028 case LTTCOMM_SESSIOND_COMMAND_ROTATE_SESSION:
1029 case LTTCOMM_SESSIOND_COMMAND_ROTATION_GET_INFO:
1030 case LTTCOMM_SESSIOND_COMMAND_ROTATION_SET_SCHEDULE:
1031 case LTTCOMM_SESSIOND_COMMAND_SESSION_LIST_ROTATION_SCHEDULES:
1032 case LTTCOMM_SESSIOND_COMMAND_CLEAR_SESSION:
1033 case LTTCOMM_SESSIOND_COMMAND_LIST_TRIGGERS:
1034 case LTTCOMM_SESSIOND_COMMAND_EXECUTE_ERROR_QUERY:
9124c630
JR
1035 need_domain = false;
1036 break;
1037 default:
1038 need_domain = true;
1039 }
1040
1041 /* Needs a functioning consumerd? */
1042 switch (cmd_ctx->lsm.cmd_type) {
37a5ef39
JG
1043 case LTTCOMM_SESSIOND_COMMAND_REGISTER_TRIGGER:
1044 case LTTCOMM_SESSIOND_COMMAND_UNREGISTER_TRIGGER:
1045 case LTTCOMM_SESSIOND_COMMAND_EXECUTE_ERROR_QUERY:
9124c630 1046 need_consumerd = false;
917a718d
JG
1047 break;
1048 default:
9124c630
JR
1049 need_consumerd = true;
1050 break;
917a718d
JG
1051 }
1052
412d7227 1053 if (the_config.no_kernel && need_domain &&
28ab034a 1054 cmd_ctx->lsm.domain.type == LTTNG_DOMAIN_KERNEL) {
917a718d
JG
1055 if (!is_root) {
1056 ret = LTTNG_ERR_NEED_ROOT_SESSIOND;
1057 } else {
1058 ret = LTTNG_ERR_KERN_NA;
1059 }
1060 goto error;
1061 }
1062
1063 /* Deny register consumer if we already have a spawned consumer. */
37a5ef39 1064 if (cmd_ctx->lsm.cmd_type == LTTCOMM_SESSIOND_COMMAND_REGISTER_CONSUMER) {
412d7227
SM
1065 pthread_mutex_lock(&the_kconsumer_data.pid_mutex);
1066 if (the_kconsumer_data.pid > 0) {
917a718d 1067 ret = LTTNG_ERR_KERN_CONSUMER_FAIL;
412d7227 1068 pthread_mutex_unlock(&the_kconsumer_data.pid_mutex);
917a718d
JG
1069 goto error;
1070 }
412d7227 1071 pthread_mutex_unlock(&the_kconsumer_data.pid_mutex);
917a718d
JG
1072 }
1073
1074 /*
1075 * Check for command that don't needs to allocate a returned payload. We do
1076 * this here so we don't have to make the call for no payload at each
1077 * command.
1078 */
28ab034a 1079 switch (cmd_ctx->lsm.cmd_type) {
37a5ef39
JG
1080 case LTTCOMM_SESSIOND_COMMAND_LIST_SESSIONS:
1081 case LTTCOMM_SESSIOND_COMMAND_LIST_TRACEPOINTS:
1082 case LTTCOMM_SESSIOND_COMMAND_LIST_TRACEPOINT_FIELDS:
1083 case LTTCOMM_SESSIOND_COMMAND_LIST_DOMAINS:
1084 case LTTCOMM_SESSIOND_COMMAND_LIST_CHANNELS:
1085 case LTTCOMM_SESSIOND_COMMAND_LIST_EVENTS:
1086 case LTTCOMM_SESSIOND_COMMAND_LIST_SYSCALLS:
1087 case LTTCOMM_SESSIOND_COMMAND_SESSION_LIST_ROTATION_SCHEDULES:
1088 case LTTCOMM_SESSIOND_COMMAND_PROCESS_ATTR_TRACKER_GET_POLICY:
1089 case LTTCOMM_SESSIOND_COMMAND_PROCESS_ATTR_TRACKER_GET_INCLUSION_SET:
1090 case LTTCOMM_SESSIOND_COMMAND_DATA_PENDING:
1091 case LTTCOMM_SESSIOND_COMMAND_ROTATE_SESSION:
1092 case LTTCOMM_SESSIOND_COMMAND_ROTATION_GET_INFO:
1093 case LTTCOMM_SESSIOND_COMMAND_REGISTER_TRIGGER:
1094 case LTTCOMM_SESSIOND_COMMAND_LIST_TRIGGERS:
1095 case LTTCOMM_SESSIOND_COMMAND_EXECUTE_ERROR_QUERY:
917a718d
JG
1096 break;
1097 default:
1098 /* Setup lttng message with no payload */
cd9adb8b 1099 ret = setup_lttng_msg_no_cmd_header(cmd_ctx, nullptr, 0);
917a718d
JG
1100 if (ret < 0) {
1101 /* This label does not try to unlock the session */
1102 goto init_setup_error;
1103 }
1104 }
1105
1106 /* Commands that DO NOT need a session. */
3a91de3a 1107 switch (cmd_ctx->lsm.cmd_type) {
37a5ef39
JG
1108 case LTTCOMM_SESSIOND_COMMAND_CREATE_SESSION_EXT:
1109 case LTTCOMM_SESSIOND_COMMAND_LIST_SESSIONS:
1110 case LTTCOMM_SESSIOND_COMMAND_LIST_TRACEPOINTS:
1111 case LTTCOMM_SESSIOND_COMMAND_LIST_SYSCALLS:
1112 case LTTCOMM_SESSIOND_COMMAND_LIST_TRACEPOINT_FIELDS:
1113 case LTTCOMM_SESSIOND_COMMAND_SAVE_SESSION:
1114 case LTTCOMM_SESSIOND_COMMAND_REGISTER_TRIGGER:
1115 case LTTCOMM_SESSIOND_COMMAND_UNREGISTER_TRIGGER:
1116 case LTTCOMM_SESSIOND_COMMAND_LIST_TRIGGERS:
1117 case LTTCOMM_SESSIOND_COMMAND_EXECUTE_ERROR_QUERY:
9124c630 1118 need_tracing_session = false;
917a718d
JG
1119 break;
1120 default:
3a91de3a 1121 DBG("Getting session %s by name", cmd_ctx->lsm.session.name);
917a718d
JG
1122 /*
1123 * We keep the session list lock across _all_ commands
1124 * for now, because the per-session lock does not
1125 * handle teardown properly.
1126 */
1127 session_lock_list();
3a91de3a 1128 cmd_ctx->session = session_find_by_name(cmd_ctx->lsm.session.name);
cd9adb8b 1129 if (cmd_ctx->session == nullptr) {
917a718d
JG
1130 ret = LTTNG_ERR_SESS_NOT_FOUND;
1131 goto error;
1132 } else {
1133 /* Acquire lock for the session */
1134 session_lock(cmd_ctx->session);
1135 }
1136 break;
1137 }
1138
1139 /*
1140 * Commands that need a valid session but should NOT create one if none
1141 * exists. Instead of creating one and destroying it when the command is
1142 * handled, process that right before so we save some round trip in useless
1143 * code path.
1144 */
3a91de3a 1145 switch (cmd_ctx->lsm.cmd_type) {
37a5ef39
JG
1146 case LTTCOMM_SESSIOND_COMMAND_DISABLE_CHANNEL:
1147 case LTTCOMM_SESSIOND_COMMAND_DISABLE_EVENT:
3a91de3a 1148 switch (cmd_ctx->lsm.domain.type) {
917a718d
JG
1149 case LTTNG_DOMAIN_KERNEL:
1150 if (!cmd_ctx->session->kernel_session) {
1151 ret = LTTNG_ERR_NO_CHANNEL;
1152 goto error;
1153 }
1154 break;
1155 case LTTNG_DOMAIN_JUL:
1156 case LTTNG_DOMAIN_LOG4J:
1157 case LTTNG_DOMAIN_PYTHON:
1158 case LTTNG_DOMAIN_UST:
1159 if (!cmd_ctx->session->ust_session) {
1160 ret = LTTNG_ERR_NO_CHANNEL;
1161 goto error;
1162 }
1163 break;
1164 default:
1165 ret = LTTNG_ERR_UNKNOWN_DOMAIN;
1166 goto error;
1167 }
1168 default:
1169 break;
1170 }
1171
1172 if (!need_domain) {
1173 goto skip_domain;
1174 }
1175
1176 /*
1177 * Check domain type for specific "pre-action".
1178 */
3a91de3a 1179 switch (cmd_ctx->lsm.domain.type) {
917a718d
JG
1180 case LTTNG_DOMAIN_KERNEL:
1181 if (!is_root) {
1182 ret = LTTNG_ERR_NEED_ROOT_SESSIOND;
1183 goto error;
1184 }
1185
7d268848
MD
1186 /* Kernel tracer check */
1187 if (!kernel_tracer_is_initialized()) {
1188 /* Basically, load kernel tracer modules */
1189 ret = init_kernel_tracer();
1190 if (ret != 0) {
1191 goto error;
1192 }
1193 }
1194
917a718d 1195 /* Consumer is in an ERROR state. Report back to client */
28ab034a 1196 if (need_consumerd && uatomic_read(&the_kernel_consumerd_state) == CONSUMER_ERROR) {
917a718d
JG
1197 ret = LTTNG_ERR_NO_KERNCONSUMERD;
1198 goto error;
1199 }
1200
1201 /* Need a session for kernel command */
1202 if (need_tracing_session) {
cd9adb8b 1203 if (cmd_ctx->session->kernel_session == nullptr) {
917a718d 1204 ret = create_kernel_session(cmd_ctx->session);
51630bd8 1205 if (ret != LTTNG_OK) {
917a718d
JG
1206 ret = LTTNG_ERR_KERN_SESS_FAIL;
1207 goto error;
1208 }
1209 }
1210
1211 /* Start the kernel consumer daemon */
412d7227
SM
1212 pthread_mutex_lock(&the_kconsumer_data.pid_mutex);
1213 if (the_kconsumer_data.pid == 0 &&
28ab034a 1214 cmd_ctx->lsm.cmd_type != LTTCOMM_SESSIOND_COMMAND_REGISTER_CONSUMER) {
412d7227
SM
1215 pthread_mutex_unlock(&the_kconsumer_data.pid_mutex);
1216 ret = start_consumerd(&the_kconsumer_data);
917a718d
JG
1217 if (ret < 0) {
1218 ret = LTTNG_ERR_KERN_CONSUMER_FAIL;
1219 goto error;
1220 }
412d7227 1221 uatomic_set(&the_kernel_consumerd_state, CONSUMER_STARTED);
917a718d 1222 } else {
412d7227 1223 pthread_mutex_unlock(&the_kconsumer_data.pid_mutex);
917a718d
JG
1224 }
1225
1226 /*
1227 * The consumer was just spawned so we need to add the socket to
1228 * the consumer output of the session if exist.
1229 */
412d7227 1230 ret = consumer_create_socket(&the_kconsumer_data,
28ab034a 1231 cmd_ctx->session->kernel_session->consumer);
917a718d
JG
1232 if (ret < 0) {
1233 goto error;
1234 }
1235 }
1236
1237 break;
1238 case LTTNG_DOMAIN_JUL:
1239 case LTTNG_DOMAIN_LOG4J:
1240 case LTTNG_DOMAIN_PYTHON:
44760c20
JR
1241 if (!agent_tracing_is_enabled()) {
1242 ret = LTTNG_ERR_AGENT_TRACING_DISABLED;
1243 goto error;
1244 }
1245 /* Fallthrough */
917a718d
JG
1246 case LTTNG_DOMAIN_UST:
1247 {
1248 if (!ust_app_supported()) {
1249 ret = LTTNG_ERR_NO_UST;
1250 goto error;
1251 }
9124c630 1252
917a718d 1253 /* Consumer is in an ERROR state. Report back to client */
28ab034a 1254 if (need_consumerd && uatomic_read(&the_ust_consumerd_state) == CONSUMER_ERROR) {
917a718d
JG
1255 ret = LTTNG_ERR_NO_USTCONSUMERD;
1256 goto error;
1257 }
1258
1259 if (need_tracing_session) {
1260 /* Create UST session if none exist. */
cd9adb8b 1261 if (cmd_ctx->session->ust_session == nullptr) {
7966af57
SM
1262 lttng_domain domain = cmd_ctx->lsm.domain;
1263 ret = create_ust_session(cmd_ctx->session, &domain);
917a718d
JG
1264 if (ret != LTTNG_OK) {
1265 goto error;
1266 }
1267 }
1268
1269 /* Start the UST consumer daemons */
1270 /* 64-bit */
412d7227
SM
1271 pthread_mutex_lock(&the_ustconsumer64_data.pid_mutex);
1272 if (the_config.consumerd64_bin_path.value &&
28ab034a
JG
1273 the_ustconsumer64_data.pid == 0 &&
1274 cmd_ctx->lsm.cmd_type != LTTCOMM_SESSIOND_COMMAND_REGISTER_CONSUMER) {
412d7227
SM
1275 pthread_mutex_unlock(&the_ustconsumer64_data.pid_mutex);
1276 ret = start_consumerd(&the_ustconsumer64_data);
917a718d
JG
1277 if (ret < 0) {
1278 ret = LTTNG_ERR_UST_CONSUMER64_FAIL;
412d7227 1279 uatomic_set(&the_ust_consumerd64_fd, -EINVAL);
917a718d
JG
1280 goto error;
1281 }
1282
28ab034a
JG
1283 uatomic_set(&the_ust_consumerd64_fd,
1284 the_ustconsumer64_data.cmd_sock);
412d7227 1285 uatomic_set(&the_ust_consumerd_state, CONSUMER_STARTED);
917a718d 1286 } else {
412d7227 1287 pthread_mutex_unlock(&the_ustconsumer64_data.pid_mutex);
917a718d
JG
1288 }
1289
1290 /*
1291 * Setup socket for consumer 64 bit. No need for atomic access
1292 * since it was set above and can ONLY be set in this thread.
1293 */
412d7227 1294 ret = consumer_create_socket(&the_ustconsumer64_data,
28ab034a 1295 cmd_ctx->session->ust_session->consumer);
917a718d
JG
1296 if (ret < 0) {
1297 goto error;
1298 }
1299
1300 /* 32-bit */
412d7227
SM
1301 pthread_mutex_lock(&the_ustconsumer32_data.pid_mutex);
1302 if (the_config.consumerd32_bin_path.value &&
28ab034a
JG
1303 the_ustconsumer32_data.pid == 0 &&
1304 cmd_ctx->lsm.cmd_type != LTTCOMM_SESSIOND_COMMAND_REGISTER_CONSUMER) {
412d7227
SM
1305 pthread_mutex_unlock(&the_ustconsumer32_data.pid_mutex);
1306 ret = start_consumerd(&the_ustconsumer32_data);
917a718d
JG
1307 if (ret < 0) {
1308 ret = LTTNG_ERR_UST_CONSUMER32_FAIL;
412d7227 1309 uatomic_set(&the_ust_consumerd32_fd, -EINVAL);
917a718d
JG
1310 goto error;
1311 }
1312
28ab034a
JG
1313 uatomic_set(&the_ust_consumerd32_fd,
1314 the_ustconsumer32_data.cmd_sock);
412d7227 1315 uatomic_set(&the_ust_consumerd_state, CONSUMER_STARTED);
917a718d 1316 } else {
412d7227 1317 pthread_mutex_unlock(&the_ustconsumer32_data.pid_mutex);
917a718d
JG
1318 }
1319
1320 /*
1321 * Setup socket for consumer 32 bit. No need for atomic access
1322 * since it was set above and can ONLY be set in this thread.
1323 */
412d7227 1324 ret = consumer_create_socket(&the_ustconsumer32_data,
28ab034a 1325 cmd_ctx->session->ust_session->consumer);
917a718d
JG
1326 if (ret < 0) {
1327 goto error;
1328 }
1329 }
1330 break;
1331 }
1332 default:
1333 break;
1334 }
1335skip_domain:
1336
1337 /* Validate consumer daemon state when start/stop trace command */
37a5ef39 1338 if (cmd_ctx->lsm.cmd_type == LTTCOMM_SESSIOND_COMMAND_START_TRACE ||
28ab034a 1339 cmd_ctx->lsm.cmd_type == LTTCOMM_SESSIOND_COMMAND_STOP_TRACE) {
3a91de3a 1340 switch (cmd_ctx->lsm.domain.type) {
917a718d
JG
1341 case LTTNG_DOMAIN_NONE:
1342 break;
1343 case LTTNG_DOMAIN_JUL:
1344 case LTTNG_DOMAIN_LOG4J:
1345 case LTTNG_DOMAIN_PYTHON:
1346 case LTTNG_DOMAIN_UST:
412d7227 1347 if (uatomic_read(&the_ust_consumerd_state) != CONSUMER_STARTED) {
917a718d
JG
1348 ret = LTTNG_ERR_NO_USTCONSUMERD;
1349 goto error;
1350 }
1351 break;
1352 case LTTNG_DOMAIN_KERNEL:
412d7227 1353 if (uatomic_read(&the_kernel_consumerd_state) != CONSUMER_STARTED) {
917a718d
JG
1354 ret = LTTNG_ERR_NO_KERNCONSUMERD;
1355 goto error;
1356 }
1357 break;
1358 default:
1359 ret = LTTNG_ERR_UNKNOWN_DOMAIN;
1360 goto error;
1361 }
1362 }
1363
1364 /*
d7b377ed 1365 * Check that the UID matches that of the tracing session.
917a718d
JG
1366 * The root user can interact with all sessions.
1367 */
1368 if (need_tracing_session) {
1369 if (!session_access_ok(cmd_ctx->session,
28ab034a
JG
1370 LTTNG_SOCK_GET_UID_CRED(&cmd_ctx->creds)) ||
1371 cmd_ctx->session->destroyed) {
917a718d
JG
1372 ret = LTTNG_ERR_EPERM;
1373 goto error;
1374 }
1375 }
1376
1377 /*
1378 * Send relayd information to consumer as soon as we have a domain and a
1379 * session defined.
1380 */
1381 if (cmd_ctx->session && need_domain) {
1382 /*
1383 * Setup relayd if not done yet. If the relayd information was already
1384 * sent to the consumer, this call will gracefully return.
1385 */
1386 ret = cmd_setup_relayd(cmd_ctx->session);
1387 if (ret != LTTNG_OK) {
1388 goto error;
1389 }
1390 }
1391
1392 /* Process by command type */
3a91de3a 1393 switch (cmd_ctx->lsm.cmd_type) {
37a5ef39 1394 case LTTCOMM_SESSIOND_COMMAND_ADD_CONTEXT:
917a718d 1395 {
cd9adb8b 1396 struct lttng_event_context *event_context = nullptr;
26e1c61f 1397 const enum lttng_error_code ret_code =
28ab034a 1398 receive_lttng_event_context(cmd_ctx, *sock, sock_error, &event_context);
917a718d 1399
26e1c61f
JR
1400 if (ret_code != LTTNG_OK) {
1401 ret = (int) ret_code;
917a718d
JG
1402 goto error;
1403 }
26e1c61f
JR
1404
1405 ret = cmd_add_context(cmd_ctx, event_context, the_kernel_poll_pipe[1]);
1406 lttng_event_context_destroy(event_context);
917a718d
JG
1407 break;
1408 }
37a5ef39 1409 case LTTCOMM_SESSIOND_COMMAND_DISABLE_CHANNEL:
917a718d 1410 {
28ab034a
JG
1411 ret = cmd_disable_channel(cmd_ctx->session,
1412 cmd_ctx->lsm.domain.type,
1413 cmd_ctx->lsm.u.disable.channel_name);
917a718d
JG
1414 break;
1415 }
37a5ef39 1416 case LTTCOMM_SESSIOND_COMMAND_ENABLE_CHANNEL:
917a718d 1417 {
28ab034a 1418 ret = cmd_enable_channel(cmd_ctx, *sock, the_kernel_poll_pipe[1]);
917a718d
JG
1419 break;
1420 }
37a5ef39
JG
1421 case LTTCOMM_SESSIOND_COMMAND_PROCESS_ATTR_TRACKER_ADD_INCLUDE_VALUE:
1422 case LTTCOMM_SESSIOND_COMMAND_PROCESS_ATTR_TRACKER_REMOVE_INCLUDE_VALUE:
917a718d 1423 {
159b042f
JG
1424 struct lttng_dynamic_buffer payload;
1425 struct lttng_buffer_view payload_view;
28ab034a
JG
1426 const bool add_value = cmd_ctx->lsm.cmd_type ==
1427 LTTCOMM_SESSIOND_COMMAND_PROCESS_ATTR_TRACKER_ADD_INCLUDE_VALUE;
159b042f 1428 const size_t name_len =
28ab034a 1429 cmd_ctx->lsm.u.process_attr_tracker_add_remove_include_value.name_len;
159b042f 1430 const enum lttng_domain_type domain_type =
28ab034a 1431 (enum lttng_domain_type) cmd_ctx->lsm.domain.type;
159b042f 1432 const enum lttng_process_attr process_attr =
28ab034a
JG
1433 (enum lttng_process_attr) cmd_ctx->lsm.u
1434 .process_attr_tracker_add_remove_include_value.process_attr;
159b042f 1435 const enum lttng_process_attr_value_type value_type =
28ab034a
JG
1436 (enum lttng_process_attr_value_type) cmd_ctx->lsm.u
1437 .process_attr_tracker_add_remove_include_value.value_type;
159b042f
JG
1438 struct process_attr_value *value;
1439 enum lttng_error_code ret_code;
1434fd36
MJ
1440 long login_name_max;
1441
1442 login_name_max = sysconf(_SC_LOGIN_NAME_MAX);
1443 if (login_name_max < 0) {
1444 PERROR("Failed to get _SC_LOGIN_NAME_MAX system configuration");
1445 ret = LTTNG_ERR_INVALID;
1446 goto error;
1447 }
159b042f
JG
1448
1449 /* Receive remaining variable length payload if applicable. */
1434fd36 1450 if (name_len > login_name_max) {
159b042f
JG
1451 /*
1452 * POSIX mandates user and group names that are at least
1453 * 8 characters long. Note that although shadow-utils
1454 * (useradd, groupaadd, etc.) use 32 chars as their
1455 * limit (from bits/utmp.h, UT_NAMESIZE),
1456 * LOGIN_NAME_MAX is defined to 256.
1457 */
1434fd36 1458 ERR("Rejecting process attribute tracker value %s as the provided exceeds the maximal allowed length: argument length = %zu, maximal length = %ld",
28ab034a
JG
1459 add_value ? "addition" : "removal",
1460 name_len,
1461 login_name_max);
159b042f 1462 ret = LTTNG_ERR_INVALID;
2d97a006
JR
1463 goto error;
1464 }
1465
159b042f
JG
1466 lttng_dynamic_buffer_init(&payload);
1467 if (name_len != 0) {
1468 /*
1469 * Receive variable payload for user/group name
1470 * arguments.
1471 */
1472 ret = lttng_dynamic_buffer_set_size(&payload, name_len);
1473 if (ret) {
1474 ERR("Failed to allocate buffer to receive payload of %s process attribute tracker value argument",
28ab034a 1475 add_value ? "add" : "remove");
55c9e7ca 1476 ret = LTTNG_ERR_NOMEM;
159b042f 1477 goto error_add_remove_tracker_value;
55c9e7ca 1478 }
159b042f 1479
28ab034a 1480 ret = lttcomm_recv_unix_sock(*sock, payload.data, name_len);
55c9e7ca 1481 if (ret <= 0) {
159b042f 1482 ERR("Failed to receive payload of %s process attribute tracker value argument",
28ab034a 1483 add_value ? "add" : "remove");
55c9e7ca 1484 *sock_error = 1;
159b042f
JG
1485 ret = LTTNG_ERR_INVALID_PROTOCOL;
1486 goto error_add_remove_tracker_value;
55c9e7ca 1487 }
159b042f 1488 }
2d97a006 1489
28ab034a 1490 payload_view = lttng_buffer_view_from_dynamic_buffer(&payload, 0, name_len);
3e6e0df2
JG
1491 if (name_len > 0 && !lttng_buffer_view_is_valid(&payload_view)) {
1492 ret = LTTNG_ERR_INVALID_PROTOCOL;
1493 goto error_add_remove_tracker_value;
1494 }
1495
159b042f
JG
1496 /*
1497 * Validate the value type and domains are legal for the process
1498 * attribute tracker that is specified and convert the value to
1499 * add/remove to the internal sessiond representation.
1500 */
28ab034a
JG
1501 ret_code = process_attr_value_from_comm(
1502 domain_type,
1503 process_attr,
1504 value_type,
1505 &cmd_ctx->lsm.u.process_attr_tracker_add_remove_include_value.integral_value,
1506 &payload_view,
1507 &value);
159b042f
JG
1508 if (ret_code != LTTNG_OK) {
1509 ret = ret_code;
1510 goto error_add_remove_tracker_value;
55c9e7ca 1511 }
159b042f
JG
1512
1513 if (add_value) {
1514 ret = cmd_process_attr_tracker_inclusion_set_add_value(
28ab034a 1515 cmd_ctx->session, domain_type, process_attr, value);
159b042f
JG
1516 } else {
1517 ret = cmd_process_attr_tracker_inclusion_set_remove_value(
28ab034a 1518 cmd_ctx->session, domain_type, process_attr, value);
159b042f
JG
1519 }
1520 process_attr_value_destroy(value);
1521 error_add_remove_tracker_value:
1522 lttng_dynamic_buffer_reset(&payload);
1523 break;
1524 }
37a5ef39 1525 case LTTCOMM_SESSIOND_COMMAND_PROCESS_ATTR_TRACKER_GET_POLICY:
159b042f
JG
1526 {
1527 enum lttng_tracking_policy tracking_policy;
1528 const enum lttng_domain_type domain_type =
28ab034a 1529 (enum lttng_domain_type) cmd_ctx->lsm.domain.type;
159b042f 1530 const enum lttng_process_attr process_attr =
28ab034a
JG
1531 (enum lttng_process_attr) cmd_ctx->lsm.u
1532 .process_attr_tracker_get_tracking_policy.process_attr;
159b042f
JG
1533
1534 ret = cmd_process_attr_tracker_get_tracking_policy(
28ab034a 1535 cmd_ctx->session, domain_type, process_attr, &tracking_policy);
159b042f 1536 if (ret != LTTNG_OK) {
55c9e7ca
JR
1537 goto error;
1538 }
2d97a006 1539
7966af57 1540 uint32_t tracking_policy_u32 = tracking_policy;
28ab034a
JG
1541 ret = setup_lttng_msg_no_cmd_header(
1542 cmd_ctx, &tracking_policy_u32, sizeof(uint32_t));
159b042f
JG
1543 if (ret < 0) {
1544 ret = LTTNG_ERR_NOMEM;
2d97a006
JR
1545 goto error;
1546 }
159b042f 1547 ret = LTTNG_OK;
917a718d
JG
1548 break;
1549 }
37a5ef39 1550 case LTTCOMM_SESSIOND_COMMAND_PROCESS_ATTR_TRACKER_SET_POLICY:
917a718d 1551 {
159b042f 1552 const enum lttng_tracking_policy tracking_policy =
28ab034a
JG
1553 (enum lttng_tracking_policy) cmd_ctx->lsm.u
1554 .process_attr_tracker_set_tracking_policy.tracking_policy;
159b042f 1555 const enum lttng_domain_type domain_type =
28ab034a 1556 (enum lttng_domain_type) cmd_ctx->lsm.domain.type;
159b042f 1557 const enum lttng_process_attr process_attr =
28ab034a
JG
1558 (enum lttng_process_attr) cmd_ctx->lsm.u
1559 .process_attr_tracker_set_tracking_policy.process_attr;
159b042f
JG
1560
1561 ret = cmd_process_attr_tracker_set_tracking_policy(
28ab034a 1562 cmd_ctx->session, domain_type, process_attr, tracking_policy);
159b042f
JG
1563 if (ret != LTTNG_OK) {
1564 goto error;
55c9e7ca 1565 }
159b042f
JG
1566 break;
1567 }
37a5ef39 1568 case LTTCOMM_SESSIOND_COMMAND_PROCESS_ATTR_TRACKER_GET_INCLUSION_SET:
159b042f
JG
1569 {
1570 struct lttng_process_attr_values *values;
1571 struct lttng_dynamic_buffer reply;
1572 const enum lttng_domain_type domain_type =
28ab034a 1573 (enum lttng_domain_type) cmd_ctx->lsm.domain.type;
159b042f 1574 const enum lttng_process_attr process_attr =
28ab034a
JG
1575 (enum lttng_process_attr)
1576 cmd_ctx->lsm.u.process_attr_tracker_get_inclusion_set.process_attr;
159b042f
JG
1577
1578 ret = cmd_process_attr_tracker_get_inclusion_set(
28ab034a 1579 cmd_ctx->session, domain_type, process_attr, &values);
159b042f 1580 if (ret != LTTNG_OK) {
55c9e7ca
JR
1581 goto error;
1582 }
2d97a006 1583
159b042f
JG
1584 lttng_dynamic_buffer_init(&reply);
1585 ret = lttng_process_attr_values_serialize(values, &reply);
1586 if (ret < 0) {
1587 goto error_tracker_get_inclusion_set;
2d97a006
JR
1588 }
1589
28ab034a 1590 ret = setup_lttng_msg_no_cmd_header(cmd_ctx, reply.data, reply.size);
159b042f
JG
1591 if (ret < 0) {
1592 ret = LTTNG_ERR_NOMEM;
1593 goto error_tracker_get_inclusion_set;
1594 }
1595 ret = LTTNG_OK;
1596
1597 error_tracker_get_inclusion_set:
1598 lttng_process_attr_values_destroy(values);
1599 lttng_dynamic_buffer_reset(&reply);
917a718d
JG
1600 break;
1601 }
37a5ef39
JG
1602 case LTTCOMM_SESSIOND_COMMAND_ENABLE_EVENT:
1603 case LTTCOMM_SESSIOND_COMMAND_DISABLE_EVENT:
917a718d 1604 {
8ddd72ef
JR
1605 struct lttng_event *event;
1606 char *filter_expression;
1607 struct lttng_event_exclusion *exclusions;
1608 struct lttng_bytecode *bytecode;
28ab034a
JG
1609 const enum lttng_error_code ret_code = receive_lttng_event(cmd_ctx,
1610 *sock,
1611 sock_error,
1612 &event,
1613 &filter_expression,
1614 &bytecode,
1615 &exclusions);
917a718d 1616
8ddd72ef
JR
1617 if (ret_code != LTTNG_OK) {
1618 ret = (int) ret_code;
917a718d
JG
1619 goto error;
1620 }
1621
8ddd72ef
JR
1622 /*
1623 * Ownership of filter_expression, exclusions, and bytecode is
1624 * always transferred.
1625 */
37a5ef39 1626 ret = cmd_ctx->lsm.cmd_type == LTTCOMM_SESSIOND_COMMAND_ENABLE_EVENT ?
28ab034a
JG
1627 cmd_enable_event(cmd_ctx,
1628 event,
1629 filter_expression,
1630 exclusions,
1631 bytecode,
1632 the_kernel_poll_pipe[1]) :
1633 cmd_disable_event(cmd_ctx, event, filter_expression, bytecode, exclusions);
8ddd72ef 1634 lttng_event_destroy(event);
917a718d
JG
1635 break;
1636 }
37a5ef39 1637 case LTTCOMM_SESSIOND_COMMAND_LIST_TRACEPOINTS:
917a718d 1638 {
8ddd72ef
JR
1639 enum lttng_error_code ret_code;
1640 size_t original_payload_size;
1641 size_t payload_size;
1642 const size_t command_header_size = sizeof(struct lttcomm_list_command_header);
1643
1644 ret = setup_empty_lttng_msg(cmd_ctx);
1645 if (ret) {
1646 ret = LTTNG_ERR_NOMEM;
1647 goto setup_error;
1648 }
1649
1650 original_payload_size = cmd_ctx->reply_payload.buffer.size;
917a718d
JG
1651
1652 session_lock_list();
28ab034a 1653 ret_code = cmd_list_tracepoints(cmd_ctx->lsm.domain.type, &cmd_ctx->reply_payload);
917a718d 1654 session_unlock_list();
8ddd72ef
JR
1655 if (ret_code != LTTNG_OK) {
1656 ret = (int) ret_code;
917a718d
JG
1657 goto error;
1658 }
1659
28ab034a
JG
1660 payload_size = cmd_ctx->reply_payload.buffer.size - command_header_size -
1661 original_payload_size;
8ddd72ef 1662 update_lttng_msg(cmd_ctx, command_header_size, payload_size);
917a718d
JG
1663
1664 ret = LTTNG_OK;
1665 break;
1666 }
37a5ef39 1667 case LTTCOMM_SESSIOND_COMMAND_LIST_TRACEPOINT_FIELDS:
917a718d 1668 {
b2d68839
JR
1669 enum lttng_error_code ret_code;
1670 size_t original_payload_size;
1671 size_t payload_size;
1672 const size_t command_header_size = sizeof(struct lttcomm_list_command_header);
1673
1674 ret = setup_empty_lttng_msg(cmd_ctx);
1675 if (ret) {
1676 ret = LTTNG_ERR_NOMEM;
1677 goto setup_error;
1678 }
1679
1680 original_payload_size = cmd_ctx->reply_payload.buffer.size;
917a718d
JG
1681
1682 session_lock_list();
28ab034a
JG
1683 ret_code = cmd_list_tracepoint_fields(cmd_ctx->lsm.domain.type,
1684 &cmd_ctx->reply_payload);
917a718d 1685 session_unlock_list();
b2d68839
JR
1686 if (ret_code != LTTNG_OK) {
1687 ret = (int) ret_code;
917a718d
JG
1688 goto error;
1689 }
1690
28ab034a
JG
1691 payload_size = cmd_ctx->reply_payload.buffer.size - command_header_size -
1692 original_payload_size;
b2d68839 1693 update_lttng_msg(cmd_ctx, command_header_size, payload_size);
917a718d
JG
1694
1695 ret = LTTNG_OK;
1696 break;
1697 }
37a5ef39 1698 case LTTCOMM_SESSIOND_COMMAND_LIST_SYSCALLS:
917a718d 1699 {
8ddd72ef
JR
1700 enum lttng_error_code ret_code;
1701 size_t original_payload_size;
1702 size_t payload_size;
1703 const size_t command_header_size = sizeof(struct lttcomm_list_command_header);
917a718d 1704
8ddd72ef
JR
1705 ret = setup_empty_lttng_msg(cmd_ctx);
1706 if (ret) {
1707 ret = LTTNG_ERR_NOMEM;
1708 goto setup_error;
917a718d
JG
1709 }
1710
8ddd72ef 1711 original_payload_size = cmd_ctx->reply_payload.buffer.size;
917a718d 1712
8ddd72ef
JR
1713 ret_code = cmd_list_syscalls(&cmd_ctx->reply_payload);
1714 if (ret_code != LTTNG_OK) {
1715 ret = (int) ret_code;
1716 goto error;
917a718d
JG
1717 }
1718
28ab034a
JG
1719 payload_size = cmd_ctx->reply_payload.buffer.size - command_header_size -
1720 original_payload_size;
8ddd72ef
JR
1721 update_lttng_msg(cmd_ctx, command_header_size, payload_size);
1722
917a718d
JG
1723 ret = LTTNG_OK;
1724 break;
1725 }
37a5ef39 1726 case LTTCOMM_SESSIOND_COMMAND_SET_CONSUMER_URI:
917a718d
JG
1727 {
1728 size_t nb_uri, len;
1729 struct lttng_uri *uris;
1730
3a91de3a 1731 nb_uri = cmd_ctx->lsm.u.uri.size;
917a718d
JG
1732 len = nb_uri * sizeof(struct lttng_uri);
1733
1734 if (nb_uri == 0) {
1735 ret = LTTNG_ERR_INVALID;
1736 goto error;
1737 }
1738
64803277 1739 uris = calloc<lttng_uri>(nb_uri);
cd9adb8b 1740 if (uris == nullptr) {
917a718d
JG
1741 ret = LTTNG_ERR_FATAL;
1742 goto error;
1743 }
1744
1745 /* Receive variable len data */
1746 DBG("Receiving %zu URI(s) from client ...", nb_uri);
3e3665b8 1747 ret = lttcomm_recv_unix_sock(*sock, uris, len);
917a718d
JG
1748 if (ret <= 0) {
1749 DBG("No URIs received from client... continuing");
1750 *sock_error = 1;
1751 ret = LTTNG_ERR_SESSION_FAIL;
1752 free(uris);
1753 goto error;
1754 }
1755
1756 ret = cmd_set_consumer_uri(cmd_ctx->session, nb_uri, uris);
1757 free(uris);
1758 if (ret != LTTNG_OK) {
1759 goto error;
1760 }
1761
917a718d
JG
1762 break;
1763 }
37a5ef39 1764 case LTTCOMM_SESSIOND_COMMAND_START_TRACE:
917a718d
JG
1765 {
1766 /*
1767 * On the first start, if we have a kernel session and we have
1768 * enabled time or size-based rotations, we have to make sure
1769 * the kernel tracer supports it.
1770 */
28ab034a
JG
1771 if (!cmd_ctx->session->has_been_started && cmd_ctx->session->kernel_session &&
1772 (cmd_ctx->session->rotate_timer_period || cmd_ctx->session->rotate_size) &&
1773 !check_rotate_compatible()) {
917a718d
JG
1774 DBG("Kernel tracer version is not compatible with the rotation feature");
1775 ret = LTTNG_ERR_ROTATION_WRONG_VERSION;
1776 goto error;
1777 }
1778 ret = cmd_start_trace(cmd_ctx->session);
1779 break;
1780 }
37a5ef39 1781 case LTTCOMM_SESSIOND_COMMAND_STOP_TRACE:
917a718d
JG
1782 {
1783 ret = cmd_stop_trace(cmd_ctx->session);
1784 break;
1785 }
37a5ef39 1786 case LTTCOMM_SESSIOND_COMMAND_DESTROY_SESSION:
917a718d 1787 {
0038180d 1788 ret = cmd_destroy_session(cmd_ctx->session, sock);
917a718d
JG
1789 break;
1790 }
37a5ef39 1791 case LTTCOMM_SESSIOND_COMMAND_LIST_DOMAINS:
917a718d
JG
1792 {
1793 ssize_t nb_dom;
cd9adb8b 1794 struct lttng_domain *domains = nullptr;
917a718d
JG
1795
1796 nb_dom = cmd_list_domains(cmd_ctx->session, &domains);
1797 if (nb_dom < 0) {
1798 /* Return value is a negative lttng_error_code. */
1799 ret = -nb_dom;
1800 goto error;
1801 }
1802
28ab034a
JG
1803 ret = setup_lttng_msg_no_cmd_header(
1804 cmd_ctx, domains, nb_dom * sizeof(struct lttng_domain));
917a718d
JG
1805 free(domains);
1806
1807 if (ret < 0) {
1808 goto setup_error;
1809 }
1810
1811 ret = LTTNG_OK;
1812 break;
1813 }
37a5ef39 1814 case LTTCOMM_SESSIOND_COMMAND_LIST_CHANNELS:
917a718d 1815 {
999af9c1
JR
1816 enum lttng_error_code ret_code;
1817 size_t original_payload_size;
1818 size_t payload_size;
1819 const size_t command_header_size = sizeof(struct lttcomm_list_command_header);
917a718d 1820
999af9c1
JR
1821 ret = setup_empty_lttng_msg(cmd_ctx);
1822 if (ret) {
1823 ret = LTTNG_ERR_NOMEM;
1824 goto setup_error;
917a718d
JG
1825 }
1826
999af9c1 1827 original_payload_size = cmd_ctx->reply_payload.buffer.size;
917a718d 1828
28ab034a
JG
1829 ret_code = cmd_list_channels(
1830 cmd_ctx->lsm.domain.type, cmd_ctx->session, &cmd_ctx->reply_payload);
999af9c1
JR
1831 if (ret_code != LTTNG_OK) {
1832 ret = (int) ret_code;
1833 goto error;
917a718d
JG
1834 }
1835
28ab034a
JG
1836 payload_size = cmd_ctx->reply_payload.buffer.size - command_header_size -
1837 original_payload_size;
999af9c1
JR
1838 update_lttng_msg(cmd_ctx, command_header_size, payload_size);
1839
917a718d
JG
1840 ret = LTTNG_OK;
1841 break;
1842 }
37a5ef39 1843 case LTTCOMM_SESSIOND_COMMAND_LIST_EVENTS:
917a718d 1844 {
8ddd72ef 1845 enum lttng_error_code ret_code;
e368fb43
JG
1846 size_t original_payload_size;
1847 size_t payload_size;
8ddd72ef 1848 const size_t command_header_size = sizeof(struct lttcomm_list_command_header);
e368fb43
JG
1849
1850 ret = setup_empty_lttng_msg(cmd_ctx);
1851 if (ret) {
1852 ret = LTTNG_ERR_NOMEM;
1853 goto setup_error;
917a718d
JG
1854 }
1855
e368fb43 1856 original_payload_size = cmd_ctx->reply_payload.buffer.size;
917a718d 1857
8ddd72ef 1858 ret_code = cmd_list_events(cmd_ctx->lsm.domain.type,
28ab034a
JG
1859 cmd_ctx->session,
1860 cmd_ctx->lsm.u.list.channel_name,
1861 &cmd_ctx->reply_payload);
8ddd72ef
JR
1862 if (ret_code != LTTNG_OK) {
1863 ret = (int) ret_code;
e368fb43 1864 goto error;
917a718d
JG
1865 }
1866
28ab034a
JG
1867 payload_size = cmd_ctx->reply_payload.buffer.size - command_header_size -
1868 original_payload_size;
8ddd72ef 1869 update_lttng_msg(cmd_ctx, command_header_size, payload_size);
e368fb43 1870
917a718d
JG
1871 ret = LTTNG_OK;
1872 break;
1873 }
37a5ef39 1874 case LTTCOMM_SESSIOND_COMMAND_LIST_SESSIONS:
917a718d
JG
1875 {
1876 unsigned int nr_sessions;
64803277
SM
1877 lttng_session *sessions_payload = nullptr;
1878 size_t payload_len = 0;
917a718d
JG
1879
1880 session_lock_list();
28ab034a
JG
1881 nr_sessions = lttng_sessions_count(LTTNG_SOCK_GET_UID_CRED(&cmd_ctx->creds),
1882 LTTNG_SOCK_GET_GID_CRED(&cmd_ctx->creds));
b178f53e 1883
64803277 1884 if (nr_sessions > 0) {
28ab034a
JG
1885 payload_len = (sizeof(struct lttng_session) * nr_sessions) +
1886 (sizeof(struct lttng_session_extended) * nr_sessions);
64803277
SM
1887 sessions_payload = zmalloc<lttng_session>(payload_len);
1888 if (!sessions_payload) {
1889 session_unlock_list();
1890 ret = -ENOMEM;
1891 goto setup_error;
1892 }
917a718d 1893
28ab034a
JG
1894 cmd_list_lttng_sessions(sessions_payload,
1895 nr_sessions,
1896 LTTNG_SOCK_GET_UID_CRED(&cmd_ctx->creds),
1897 LTTNG_SOCK_GET_GID_CRED(&cmd_ctx->creds));
917a718d
JG
1898 }
1899
917a718d
JG
1900 session_unlock_list();
1901
28ab034a 1902 ret = setup_lttng_msg_no_cmd_header(cmd_ctx, sessions_payload, payload_len);
917a718d
JG
1903 free(sessions_payload);
1904
1905 if (ret < 0) {
1906 goto setup_error;
1907 }
1908
1909 ret = LTTNG_OK;
1910 break;
1911 }
37a5ef39 1912 case LTTCOMM_SESSIOND_COMMAND_REGISTER_CONSUMER:
917a718d
JG
1913 {
1914 struct consumer_data *cdata;
1915
3a91de3a 1916 switch (cmd_ctx->lsm.domain.type) {
917a718d 1917 case LTTNG_DOMAIN_KERNEL:
412d7227 1918 cdata = &the_kconsumer_data;
917a718d
JG
1919 break;
1920 default:
1921 ret = LTTNG_ERR_UND;
1922 goto error;
1923 }
1924
28ab034a
JG
1925 ret = cmd_register_consumer(
1926 cmd_ctx->session, cmd_ctx->lsm.domain.type, cmd_ctx->lsm.u.reg.path, cdata);
917a718d
JG
1927 break;
1928 }
37a5ef39 1929 case LTTCOMM_SESSIOND_COMMAND_DATA_PENDING:
917a718d
JG
1930 {
1931 int pending_ret;
1932 uint8_t pending_ret_byte;
1933
1934 pending_ret = cmd_data_pending(cmd_ctx->session);
1935
1936 /*
1937 * FIXME
1938 *
1939 * This function may returns 0 or 1 to indicate whether or not
1940 * there is data pending. In case of error, it should return an
1941 * LTTNG_ERR code. However, some code paths may still return
1942 * a nondescript error code, which we handle by returning an
1943 * "unknown" error.
1944 */
1945 if (pending_ret == 0 || pending_ret == 1) {
1946 /*
1947 * ret will be set to LTTNG_OK at the end of
1948 * this function.
1949 */
1950 } else if (pending_ret < 0) {
1951 ret = LTTNG_ERR_UNK;
1952 goto setup_error;
1953 } else {
1954 ret = pending_ret;
1955 goto setup_error;
1956 }
1957
1958 pending_ret_byte = (uint8_t) pending_ret;
1959
1960 /* 1 byte to return whether or not data is pending */
28ab034a 1961 ret = setup_lttng_msg_no_cmd_header(cmd_ctx, &pending_ret_byte, 1);
917a718d
JG
1962
1963 if (ret < 0) {
1964 goto setup_error;
1965 }
1966
1967 ret = LTTNG_OK;
1968 break;
1969 }
37a5ef39 1970 case LTTCOMM_SESSIOND_COMMAND_SNAPSHOT_ADD_OUTPUT:
917a718d 1971 {
a914e76a 1972 uint32_t snapshot_id;
917a718d 1973 struct lttcomm_lttng_output_id reply;
7966af57 1974 lttng_snapshot_output output = cmd_ctx->lsm.u.snapshot_output.output;
917a718d 1975
28ab034a 1976 ret = cmd_snapshot_add_output(cmd_ctx->session, &output, &snapshot_id);
917a718d
JG
1977 if (ret != LTTNG_OK) {
1978 goto error;
1979 }
a914e76a 1980 reply.id = snapshot_id;
917a718d 1981
28ab034a 1982 ret = setup_lttng_msg_no_cmd_header(cmd_ctx, &reply, sizeof(reply));
917a718d
JG
1983 if (ret < 0) {
1984 goto setup_error;
1985 }
1986
1987 /* Copy output list into message payload */
1988 ret = LTTNG_OK;
1989 break;
1990 }
37a5ef39 1991 case LTTCOMM_SESSIOND_COMMAND_SNAPSHOT_DEL_OUTPUT:
917a718d 1992 {
7966af57
SM
1993 lttng_snapshot_output output = cmd_ctx->lsm.u.snapshot_output.output;
1994 ret = cmd_snapshot_del_output(cmd_ctx->session, &output);
917a718d
JG
1995 break;
1996 }
37a5ef39 1997 case LTTCOMM_SESSIOND_COMMAND_SNAPSHOT_LIST_OUTPUT:
917a718d
JG
1998 {
1999 ssize_t nb_output;
cd9adb8b 2000 struct lttng_snapshot_output *outputs = nullptr;
917a718d
JG
2001
2002 nb_output = cmd_snapshot_list_outputs(cmd_ctx->session, &outputs);
2003 if (nb_output < 0) {
2004 ret = -nb_output;
2005 goto error;
2006 }
2007
a0377dfe 2008 LTTNG_ASSERT((nb_output > 0 && outputs) || nb_output == 0);
28ab034a
JG
2009 ret = setup_lttng_msg_no_cmd_header(
2010 cmd_ctx, outputs, nb_output * sizeof(struct lttng_snapshot_output));
917a718d
JG
2011 free(outputs);
2012
2013 if (ret < 0) {
2014 goto setup_error;
2015 }
2016
2017 ret = LTTNG_OK;
2018 break;
2019 }
37a5ef39 2020 case LTTCOMM_SESSIOND_COMMAND_SNAPSHOT_RECORD:
917a718d 2021 {
7966af57 2022 lttng_snapshot_output output = cmd_ctx->lsm.u.snapshot_record.output;
28ab034a
JG
2023 ret = cmd_snapshot_record(cmd_ctx->session, &output, 0); // RFC: set to zero since
2024 // it's ignored by
2025 // cmd_snapshot_record
917a718d
JG
2026 break;
2027 }
37a5ef39 2028 case LTTCOMM_SESSIOND_COMMAND_CREATE_SESSION_EXT:
917a718d 2029 {
b178f53e 2030 struct lttng_dynamic_buffer payload;
cd9adb8b 2031 struct lttng_session_descriptor *return_descriptor = nullptr;
917a718d 2032
b178f53e 2033 lttng_dynamic_buffer_init(&payload);
3e3665b8 2034 ret = cmd_create_session(cmd_ctx, *sock, &return_descriptor);
b178f53e
JG
2035 if (ret != LTTNG_OK) {
2036 goto error;
917a718d
JG
2037 }
2038
28ab034a 2039 ret = lttng_session_descriptor_serialize(return_descriptor, &payload);
b178f53e
JG
2040 if (ret) {
2041 ERR("Failed to serialize session descriptor in reply to \"create session\" command");
2042 lttng_session_descriptor_destroy(return_descriptor);
2043 ret = LTTNG_ERR_NOMEM;
2044 goto error;
917a718d 2045 }
28ab034a 2046 ret = setup_lttng_msg_no_cmd_header(cmd_ctx, payload.data, payload.size);
b178f53e
JG
2047 if (ret) {
2048 lttng_session_descriptor_destroy(return_descriptor);
2049 ret = LTTNG_ERR_NOMEM;
2050 goto error;
2051 }
2052 lttng_dynamic_buffer_reset(&payload);
2053 lttng_session_descriptor_destroy(return_descriptor);
2054 ret = LTTNG_OK;
917a718d
JG
2055 break;
2056 }
37a5ef39 2057 case LTTCOMM_SESSIOND_COMMAND_SAVE_SESSION:
917a718d 2058 {
28ab034a 2059 ret = cmd_save_sessions(&cmd_ctx->lsm.u.save_session.attr, &cmd_ctx->creds);
917a718d
JG
2060 break;
2061 }
37a5ef39 2062 case LTTCOMM_SESSIOND_COMMAND_SET_SESSION_SHM_PATH:
917a718d
JG
2063 {
2064 ret = cmd_set_session_shm_path(cmd_ctx->session,
28ab034a 2065 cmd_ctx->lsm.u.set_shm_path.shm_path);
917a718d
JG
2066 break;
2067 }
37a5ef39 2068 case LTTCOMM_SESSIOND_COMMAND_REGENERATE_METADATA:
917a718d
JG
2069 {
2070 ret = cmd_regenerate_metadata(cmd_ctx->session);
2071 break;
2072 }
37a5ef39 2073 case LTTCOMM_SESSIOND_COMMAND_REGENERATE_STATEDUMP:
917a718d
JG
2074 {
2075 ret = cmd_regenerate_statedump(cmd_ctx->session);
2076 break;
2077 }
37a5ef39 2078 case LTTCOMM_SESSIOND_COMMAND_REGISTER_TRIGGER:
917a718d 2079 {
746e08d7 2080 struct lttng_trigger *payload_trigger;
242388e4 2081 struct lttng_trigger *return_trigger;
746e08d7
JG
2082 size_t original_reply_payload_size;
2083 size_t reply_payload_size;
2084 const struct lttng_credentials cmd_creds = {
2085 .uid = LTTNG_OPTIONAL_INIT_VALUE(cmd_ctx->creds.uid),
2086 .gid = LTTNG_OPTIONAL_INIT_VALUE(cmd_ctx->creds.gid),
2087 };
242388e4
JR
2088
2089 ret = setup_empty_lttng_msg(cmd_ctx);
2090 if (ret) {
2091 ret = LTTNG_ERR_NOMEM;
2092 goto setup_error;
2093 }
2094
28ab034a 2095 ret = receive_lttng_trigger(cmd_ctx, *sock, sock_error, &payload_trigger);
746e08d7
JG
2096 if (ret != LTTNG_OK) {
2097 goto error;
2098 }
2099
2100 original_reply_payload_size = cmd_ctx->reply_payload.buffer.size;
242388e4 2101
28ab034a
JG
2102 ret = cmd_register_trigger(&cmd_creds,
2103 payload_trigger,
2104 cmd_ctx->lsm.u.trigger.is_trigger_anonymous,
2105 the_notification_thread_handle,
2106 &return_trigger);
242388e4 2107 if (ret != LTTNG_OK) {
746e08d7 2108 lttng_trigger_put(payload_trigger);
242388e4
JR
2109 goto error;
2110 }
2111
2112 ret = lttng_trigger_serialize(return_trigger, &cmd_ctx->reply_payload);
746e08d7
JG
2113 lttng_trigger_put(payload_trigger);
2114 lttng_trigger_put(return_trigger);
242388e4
JR
2115 if (ret) {
2116 ERR("Failed to serialize trigger in reply to \"register trigger\" command");
2117 ret = LTTNG_ERR_NOMEM;
242388e4
JR
2118 goto error;
2119 }
2120
28ab034a
JG
2121 reply_payload_size =
2122 cmd_ctx->reply_payload.buffer.size - original_reply_payload_size;
242388e4 2123
746e08d7 2124 update_lttng_msg(cmd_ctx, 0, reply_payload_size);
242388e4
JR
2125
2126 ret = LTTNG_OK;
917a718d
JG
2127 break;
2128 }
37a5ef39 2129 case LTTCOMM_SESSIOND_COMMAND_UNREGISTER_TRIGGER:
917a718d 2130 {
746e08d7
JG
2131 struct lttng_trigger *payload_trigger;
2132 const struct lttng_credentials cmd_creds = {
2133 .uid = LTTNG_OPTIONAL_INIT_VALUE(cmd_ctx->creds.uid),
2134 .gid = LTTNG_OPTIONAL_INIT_VALUE(cmd_ctx->creds.gid),
2135 };
2136
28ab034a 2137 ret = receive_lttng_trigger(cmd_ctx, *sock, sock_error, &payload_trigger);
746e08d7
JG
2138 if (ret != LTTNG_OK) {
2139 goto error;
2140 }
2141
28ab034a
JG
2142 ret = cmd_unregister_trigger(
2143 &cmd_creds, payload_trigger, the_notification_thread_handle);
746e08d7 2144 lttng_trigger_put(payload_trigger);
917a718d
JG
2145 break;
2146 }
37a5ef39 2147 case LTTCOMM_SESSIOND_COMMAND_ROTATE_SESSION:
917a718d
JG
2148 {
2149 struct lttng_rotate_session_return rotate_return;
2150
2151 DBG("Client rotate session \"%s\"", cmd_ctx->session->name);
2152
2153 memset(&rotate_return, 0, sizeof(rotate_return));
2154 if (cmd_ctx->session->kernel_session && !check_rotate_compatible()) {
2155 DBG("Kernel tracer version is not compatible with the rotation feature");
2156 ret = LTTNG_ERR_ROTATION_WRONG_VERSION;
2157 goto error;
2158 }
2159
28ab034a
JG
2160 ret = cmd_rotate_session(cmd_ctx->session,
2161 &rotate_return,
2162 false,
2163 LTTNG_TRACE_CHUNK_COMMAND_TYPE_MOVE_TO_COMPLETED);
917a718d
JG
2164 if (ret < 0) {
2165 ret = -ret;
2166 goto error;
2167 }
2168
28ab034a 2169 ret = setup_lttng_msg_no_cmd_header(cmd_ctx, &rotate_return, sizeof(rotate_return));
917a718d
JG
2170 if (ret < 0) {
2171 ret = -ret;
2172 goto error;
2173 }
2174
2175 ret = LTTNG_OK;
2176 break;
2177 }
37a5ef39 2178 case LTTCOMM_SESSIOND_COMMAND_ROTATION_GET_INFO:
917a718d
JG
2179 {
2180 struct lttng_rotation_get_info_return get_info_return;
2181
2182 memset(&get_info_return, 0, sizeof(get_info_return));
28ab034a
JG
2183 ret = cmd_rotate_get_info(cmd_ctx->session,
2184 &get_info_return,
2185 cmd_ctx->lsm.u.get_rotation_info.rotation_id);
917a718d
JG
2186 if (ret < 0) {
2187 ret = -ret;
2188 goto error;
2189 }
2190
28ab034a
JG
2191 ret = setup_lttng_msg_no_cmd_header(
2192 cmd_ctx, &get_info_return, sizeof(get_info_return));
917a718d
JG
2193 if (ret < 0) {
2194 ret = -ret;
2195 goto error;
2196 }
2197
2198 ret = LTTNG_OK;
2199 break;
2200 }
37a5ef39 2201 case LTTCOMM_SESSIOND_COMMAND_ROTATION_SET_SCHEDULE:
917a718d
JG
2202 {
2203 bool set_schedule;
2204 enum lttng_rotation_schedule_type schedule_type;
2205 uint64_t value;
2206
2207 if (cmd_ctx->session->kernel_session && !check_rotate_compatible()) {
2208 DBG("Kernel tracer version does not support session rotations");
2209 ret = LTTNG_ERR_ROTATION_WRONG_VERSION;
2210 goto error;
2211 }
2212
3a91de3a 2213 set_schedule = cmd_ctx->lsm.u.rotation_set_schedule.set == 1;
28ab034a
JG
2214 schedule_type = (enum lttng_rotation_schedule_type)
2215 cmd_ctx->lsm.u.rotation_set_schedule.type;
3a91de3a 2216 value = cmd_ctx->lsm.u.rotation_set_schedule.value;
917a718d 2217
28f23191
JG
2218 ret = cmd_rotation_set_schedule(
2219 cmd_ctx->session, set_schedule, schedule_type, value);
917a718d
JG
2220 if (ret != LTTNG_OK) {
2221 goto error;
2222 }
2223
2224 break;
2225 }
37a5ef39 2226 case LTTCOMM_SESSIOND_COMMAND_SESSION_LIST_ROTATION_SCHEDULES:
917a718d 2227 {
7966af57
SM
2228 lttng_session_list_schedules_return schedules;
2229
2230 schedules.periodic.set = !!cmd_ctx->session->rotate_timer_period;
2231 schedules.periodic.value = cmd_ctx->session->rotate_timer_period;
2232 schedules.size.set = !!cmd_ctx->session->rotate_size;
2233 schedules.size.value = cmd_ctx->session->rotate_size;
917a718d 2234
28ab034a 2235 ret = setup_lttng_msg_no_cmd_header(cmd_ctx, &schedules, sizeof(schedules));
917a718d
JG
2236 if (ret < 0) {
2237 ret = -ret;
2238 goto error;
2239 }
2240
2241 ret = LTTNG_OK;
2242 break;
2243 }
37a5ef39 2244 case LTTCOMM_SESSIOND_COMMAND_CLEAR_SESSION:
022349df
MD
2245 {
2246 ret = cmd_clear_session(cmd_ctx->session, sock);
2247 break;
2248 }
37a5ef39 2249 case LTTCOMM_SESSIOND_COMMAND_LIST_TRIGGERS:
fbc9f37d 2250 {
cd9adb8b 2251 struct lttng_triggers *return_triggers = nullptr;
fbc9f37d
JR
2252 size_t original_payload_size;
2253 size_t payload_size;
2254
2255 ret = setup_empty_lttng_msg(cmd_ctx);
2256 if (ret) {
2257 ret = LTTNG_ERR_NOMEM;
2258 goto setup_error;
2259 }
2260
2261 original_payload_size = cmd_ctx->reply_payload.buffer.size;
2262
28ab034a 2263 ret = cmd_list_triggers(cmd_ctx, the_notification_thread_handle, &return_triggers);
fbc9f37d
JR
2264 if (ret != LTTNG_OK) {
2265 goto error;
2266 }
2267
a0377dfe 2268 LTTNG_ASSERT(return_triggers);
28ab034a 2269 ret = lttng_triggers_serialize(return_triggers, &cmd_ctx->reply_payload);
fbc9f37d
JR
2270 lttng_triggers_destroy(return_triggers);
2271 if (ret) {
2272 ERR("Failed to serialize triggers in reply to `list triggers` command");
2273 ret = LTTNG_ERR_NOMEM;
2274 goto error;
2275 }
2276
28ab034a 2277 payload_size = cmd_ctx->reply_payload.buffer.size - original_payload_size;
fbc9f37d
JR
2278
2279 update_lttng_msg(cmd_ctx, 0, payload_size);
2280
2281 ret = LTTNG_OK;
2282 break;
2283 }
37a5ef39 2284 case LTTCOMM_SESSIOND_COMMAND_EXECUTE_ERROR_QUERY:
588c4b0d
JG
2285 {
2286 struct lttng_error_query *query;
2287 const struct lttng_credentials cmd_creds = {
2288 .uid = LTTNG_OPTIONAL_INIT_VALUE(cmd_ctx->creds.uid),
2289 .gid = LTTNG_OPTIONAL_INIT_VALUE(cmd_ctx->creds.gid),
2290 };
cd9adb8b 2291 struct lttng_error_query_results *results = nullptr;
588c4b0d
JG
2292 size_t original_payload_size;
2293 size_t payload_size;
2294
2295 ret = setup_empty_lttng_msg(cmd_ctx);
2296 if (ret) {
2297 ret = LTTNG_ERR_NOMEM;
2298 goto setup_error;
2299 }
2300
2301 original_payload_size = cmd_ctx->reply_payload.buffer.size;
2302
28ab034a 2303 ret = receive_lttng_error_query(cmd_ctx, *sock, sock_error, &query);
588c4b0d
JG
2304 if (ret != LTTNG_OK) {
2305 goto error;
2306 }
2307
28ab034a
JG
2308 ret = cmd_execute_error_query(
2309 &cmd_creds, query, &results, the_notification_thread_handle);
588c4b0d
JG
2310 lttng_error_query_destroy(query);
2311 if (ret != LTTNG_OK) {
2312 goto error;
2313 }
2314
a0377dfe 2315 LTTNG_ASSERT(results);
28ab034a 2316 ret = lttng_error_query_results_serialize(results, &cmd_ctx->reply_payload);
588c4b0d
JG
2317 lttng_error_query_results_destroy(results);
2318 if (ret) {
2319 ERR("Failed to serialize error query result set in reply to `execute error query` command");
2320 ret = LTTNG_ERR_NOMEM;
2321 goto error;
2322 }
2323
28ab034a 2324 payload_size = cmd_ctx->reply_payload.buffer.size - original_payload_size;
588c4b0d
JG
2325
2326 update_lttng_msg(cmd_ctx, 0, payload_size);
2327
2328 ret = LTTNG_OK;
2329
2330 break;
2331 }
917a718d
JG
2332 default:
2333 ret = LTTNG_ERR_UND;
2334 break;
2335 }
2336
2337error:
3a91de3a
JG
2338 if (cmd_ctx->reply_payload.buffer.size == 0) {
2339 DBG("Missing llm header, creating one.");
cd9adb8b 2340 if (setup_lttng_msg_no_cmd_header(cmd_ctx, nullptr, 0) < 0) {
917a718d
JG
2341 goto setup_error;
2342 }
2343 }
2344 /* Set return code */
3a91de3a 2345 ((struct lttcomm_lttng_msg *) (cmd_ctx->reply_payload.buffer.data))->ret_code = ret;
917a718d
JG
2346setup_error:
2347 if (cmd_ctx->session) {
2348 session_unlock(cmd_ctx->session);
2349 session_put(cmd_ctx->session);
cd9adb8b 2350 cmd_ctx->session = nullptr;
917a718d
JG
2351 }
2352 if (need_tracing_session) {
2353 session_unlock_list();
2354 }
2355init_setup_error:
a0377dfe 2356 LTTNG_ASSERT(!rcu_read_ongoing());
917a718d
JG
2357 return ret;
2358}
2359
cd9adb8b 2360static int create_client_sock()
917a718d
JG
2361{
2362 int ret, client_sock;
917a718d
JG
2363
2364 /* Create client tool unix socket */
28ab034a 2365 client_sock = lttcomm_create_unix_sock(the_config.client_unix_sock_path.value);
917a718d 2366 if (client_sock < 0) {
28ab034a 2367 ERR("Create unix sock failed: %s", the_config.client_unix_sock_path.value);
917a718d
JG
2368 ret = -1;
2369 goto end;
2370 }
2371
2372 /* Set the cloexec flag */
2373 ret = utils_set_fd_cloexec(client_sock);
2374 if (ret < 0) {
2375 ERR("Unable to set CLOEXEC flag to the client Unix socket (fd: %d). "
28ab034a
JG
2376 "Continuing but note that the consumer daemon will have a "
2377 "reference to this socket on exec()",
2378 client_sock);
917a718d
JG
2379 }
2380
2381 /* File permission MUST be 660 */
28ab034a 2382 ret = chmod(the_config.client_unix_sock_path.value, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
917a718d 2383 if (ret < 0) {
28ab034a 2384 ERR("Set file permissions failed: %s", the_config.client_unix_sock_path.value);
917a718d 2385 PERROR("chmod");
18972083
JR
2386 (void) lttcomm_close_unix_sock(client_sock);
2387 ret = -1;
917a718d
JG
2388 goto end;
2389 }
2390 DBG("Created client socket (fd = %i)", client_sock);
2391 ret = client_sock;
2392end:
917a718d
JG
2393 return ret;
2394}
2395
2396static void cleanup_client_thread(void *data)
2397{
7966af57 2398 struct lttng_pipe *quit_pipe = (lttng_pipe *) data;
917a718d
JG
2399
2400 lttng_pipe_destroy(quit_pipe);
2401}
2402
f46376a1 2403static void thread_init_cleanup(void *data __attribute__((unused)))
6cb45e93
JG
2404{
2405 set_thread_status(false);
2406}
2407
917a718d
JG
2408/*
2409 * This thread manage all clients request using the unix client socket for
2410 * communication.
2411 */
2412static void *thread_manage_clients(void *data)
2413{
8a00688e 2414 int sock = -1, ret, i, err = -1;
917a718d 2415 int sock_error;
8a00688e 2416 uint32_t nb_fd;
917a718d 2417 struct lttng_poll_event events;
0f68efb6 2418 const int client_sock = thread_state.client_sock;
7966af57 2419 struct lttng_pipe *quit_pipe = (lttng_pipe *) data;
917a718d 2420 const int thread_quit_pipe_fd = lttng_pipe_get_readfd(quit_pipe);
3a91de3a 2421 struct command_ctx cmd_ctx = {};
917a718d
JG
2422
2423 DBG("[thread] Manage client started");
2424
3a91de3a
JG
2425 lttng_payload_init(&cmd_ctx.reply_payload);
2426
917a718d
JG
2427 is_root = (getuid() == 0);
2428
cd9adb8b 2429 pthread_cleanup_push(thread_init_cleanup, nullptr);
917a718d
JG
2430
2431 rcu_register_thread();
2432
412d7227 2433 health_register(the_health_sessiond, HEALTH_SESSIOND_TYPE_CMD);
917a718d
JG
2434
2435 health_code_update();
2436
2437 ret = lttcomm_listen_unix_sock(client_sock);
2438 if (ret < 0) {
2439 goto error_listen;
2440 }
2441
2442 /*
2443 * Pass 2 as size here for the thread quit pipe and client_sock. Nothing
2444 * more will be added to this poll set.
2445 */
2446 ret = lttng_poll_create(&events, 2, LTTNG_CLOEXEC);
2447 if (ret < 0) {
2448 goto error_create_poll;
2449 }
2450
2451 /* Add the application registration socket */
2452 ret = lttng_poll_add(&events, client_sock, LPOLLIN | LPOLLPRI);
2453 if (ret < 0) {
2454 goto error;
2455 }
2456
2457 /* Add thread quit pipe */
1524f98c 2458 ret = lttng_poll_add(&events, thread_quit_pipe_fd, LPOLLIN);
917a718d
JG
2459 if (ret < 0) {
2460 goto error;
2461 }
2462
6cb45e93 2463 /* Set state as running. */
0d163d56 2464 set_thread_status(true);
6cb45e93
JG
2465 pthread_cleanup_pop(0);
2466
917a718d
JG
2467 /* This testpoint is after we signal readiness to the parent. */
2468 if (testpoint(sessiond_thread_manage_clients)) {
2469 goto error;
2470 }
2471
2472 if (testpoint(sessiond_thread_manage_clients_before_loop)) {
2473 goto error;
2474 }
2475
2476 health_code_update();
2477
cd9adb8b 2478 while (true) {
917a718d
JG
2479 const struct cmd_completion_handler *cmd_completion_handler;
2480
7966af57
SM
2481 cmd_ctx.creds.uid = UINT32_MAX;
2482 cmd_ctx.creds.gid = UINT32_MAX;
2483 cmd_ctx.creds.pid = 0;
cd9adb8b 2484 cmd_ctx.session = nullptr;
fe489250 2485 lttng_payload_clear(&cmd_ctx.reply_payload);
e368fb43 2486 cmd_ctx.lttng_msg_size = 0;
3a91de3a 2487
917a718d
JG
2488 DBG("Accepting client command ...");
2489
2490 /* Inifinite blocking call, waiting for transmission */
2491 restart:
2492 health_poll_entry();
2493 ret = lttng_poll_wait(&events, -1);
2494 health_poll_exit();
2495 if (ret < 0) {
2496 /*
2497 * Restart interrupted system call.
2498 */
2499 if (errno == EINTR) {
2500 goto restart;
2501 }
2502 goto error;
2503 }
2504
2505 nb_fd = ret;
2506
2507 for (i = 0; i < nb_fd; i++) {
8a00688e
MJ
2508 /* Fetch once the poll data. */
2509 const auto revents = LTTNG_POLL_GETEV(&events, i);
2510 const auto pollfd = LTTNG_POLL_GETFD(&events, i);
917a718d
JG
2511
2512 health_code_update();
2513
8a00688e 2514 /* Activity on thread quit pipe, exiting. */
917a718d 2515 if (pollfd == thread_quit_pipe_fd) {
8a00688e 2516 DBG("Activity on thread quit pipe");
917a718d
JG
2517 err = 0;
2518 goto exit;
8a00688e
MJ
2519 }
2520
2521 /* Event on the registration socket */
2522 if (revents & LPOLLIN) {
2523 continue;
2524 } else if (revents & (LPOLLERR | LPOLLHUP | LPOLLRDHUP)) {
2525 ERR("Client socket poll error");
2526 goto error;
917a718d 2527 } else {
8a00688e
MJ
2528 ERR("Unexpected poll events %u for sock %d", revents, pollfd);
2529 goto error;
917a718d
JG
2530 }
2531 }
2532
2533 DBG("Wait for client response");
2534
2535 health_code_update();
2536
2537 sock = lttcomm_accept_unix_sock(client_sock);
2538 if (sock < 0) {
2539 goto error;
2540 }
2541
2542 /*
2543 * Set the CLOEXEC flag. Return code is useless because either way, the
2544 * show must go on.
2545 */
2546 (void) utils_set_fd_cloexec(sock);
2547
2548 /* Set socket option for credentials retrieval */
2549 ret = lttcomm_setsockopt_creds_unix_sock(sock);
2550 if (ret < 0) {
2551 goto error;
2552 }
2553
917a718d
JG
2554 health_code_update();
2555
2556 /*
2557 * Data is received from the lttng client. The struct
2558 * lttcomm_session_msg (lsm) contains the command and data request of
2559 * the client.
2560 */
2561 DBG("Receiving data from client ...");
28ab034a
JG
2562 ret = lttcomm_recv_creds_unix_sock(
2563 sock, &cmd_ctx.lsm, sizeof(struct lttcomm_session_msg), &cmd_ctx.creds);
3a91de3a
JG
2564 if (ret != sizeof(struct lttcomm_session_msg)) {
2565 DBG("Incomplete recv() from client... continuing");
917a718d
JG
2566 ret = close(sock);
2567 if (ret) {
2568 PERROR("close");
2569 }
2570 sock = -1;
917a718d
JG
2571 continue;
2572 }
2573
2574 health_code_update();
2575
2576 // TODO: Validate cmd_ctx including sanity check for
2577 // security purpose.
2578
2579 rcu_thread_online();
2580 /*
2581 * This function dispatch the work to the kernel or userspace tracer
2582 * libs and fill the lttcomm_lttng_msg data structure of all the needed
2583 * informations for the client. The command context struct contains
2584 * everything this function may needs.
2585 */
3a91de3a 2586 ret = process_client_msg(&cmd_ctx, &sock, &sock_error);
917a718d
JG
2587 rcu_thread_offline();
2588 if (ret < 0) {
3e3665b8
JG
2589 if (sock >= 0) {
2590 ret = close(sock);
2591 if (ret) {
2592 PERROR("close");
2593 }
4a76dfd3
JR
2594 }
2595 sock = -1;
917a718d
JG
2596 /*
2597 * TODO: Inform client somehow of the fatal error. At
2598 * this point, ret < 0 means that a zmalloc failed
2599 * (ENOMEM). Error detected but still accept
2600 * command, unless a socket error has been
2601 * detected.
2602 */
917a718d
JG
2603 continue;
2604 }
2605
c7e9ffbd 2606 if (ret < LTTNG_OK || ret >= LTTNG_ERR_NR) {
7e397c55 2607 WARN("Command returned an invalid status code, returning unknown error: "
28ab034a
JG
2608 "command type = %s (%d), ret = %d",
2609 lttcomm_sessiond_command_str(
2610 (lttcomm_sessiond_command) cmd_ctx.lsm.cmd_type),
2611 cmd_ctx.lsm.cmd_type,
2612 ret);
c7e9ffbd
JG
2613 ret = LTTNG_ERR_UNK;
2614 }
2615
917a718d
JG
2616 cmd_completion_handler = cmd_pop_completion_handler();
2617 if (cmd_completion_handler) {
2618 enum lttng_error_code completion_code;
2619
28ab034a 2620 completion_code = cmd_completion_handler->run(cmd_completion_handler->data);
917a718d 2621 if (completion_code != LTTNG_OK) {
917a718d
JG
2622 continue;
2623 }
2624 }
2625
2626 health_code_update();
2627
3e3665b8 2628 if (sock >= 0) {
3a91de3a 2629 struct lttng_payload_view view =
28ab034a
JG
2630 lttng_payload_view_from_payload(&cmd_ctx.reply_payload, 0, -1);
2631 struct lttcomm_lttng_msg *llm =
2632 (typeof(llm)) cmd_ctx.reply_payload.buffer.data;
3a91de3a 2633
a0377dfe
FD
2634 LTTNG_ASSERT(cmd_ctx.reply_payload.buffer.size >= sizeof(*llm));
2635 LTTNG_ASSERT(cmd_ctx.lttng_msg_size == cmd_ctx.reply_payload.buffer.size);
3a91de3a 2636
fe489250 2637 llm->fd_count = lttng_payload_view_get_fd_handle_count(&view);
e368fb43 2638
3e3665b8 2639 DBG("Sending response (size: %d, retcode: %s (%d))",
28ab034a
JG
2640 cmd_ctx.lttng_msg_size,
2641 lttng_strerror(-llm->ret_code),
2642 llm->ret_code);
3a91de3a 2643 ret = send_unix_sock(sock, &view);
3e3665b8
JG
2644 if (ret < 0) {
2645 ERR("Failed to send data back to client");
2646 }
917a718d 2647
3e3665b8
JG
2648 /* End of transmission */
2649 ret = close(sock);
2650 if (ret) {
2651 PERROR("close");
2652 }
4a76dfd3
JR
2653 }
2654 sock = -1;
917a718d 2655
917a718d
JG
2656 health_code_update();
2657 }
2658
2659exit:
2660error:
2661 if (sock >= 0) {
2662 ret = close(sock);
2663 if (ret) {
2664 PERROR("close");
2665 }
2666 }
2667
2668 lttng_poll_clean(&events);
917a718d
JG
2669
2670error_listen:
2671error_create_poll:
412d7227 2672 unlink(the_config.client_unix_sock_path.value);
0f68efb6
JG
2673 ret = close(client_sock);
2674 if (ret) {
2675 PERROR("close");
917a718d
JG
2676 }
2677
2678 if (err) {
2679 health_error();
2680 ERR("Health error occurred in %s", __func__);
2681 }
2682
412d7227 2683 health_unregister(the_health_sessiond);
917a718d
JG
2684
2685 DBG("Client thread dying");
3a91de3a 2686 lttng_payload_reset(&cmd_ctx.reply_payload);
917a718d 2687 rcu_unregister_thread();
cd9adb8b 2688 return nullptr;
917a718d
JG
2689}
2690
28ab034a 2691static bool shutdown_client_thread(void *thread_data)
917a718d 2692{
7966af57 2693 struct lttng_pipe *client_quit_pipe = (lttng_pipe *) thread_data;
917a718d
JG
2694 const int write_fd = lttng_pipe_get_writefd(client_quit_pipe);
2695
2696 return notify_thread_pipe(write_fd) == 1;
2697}
2698
cd9adb8b 2699struct lttng_thread *launch_client_thread()
917a718d 2700{
6cb45e93 2701 bool thread_running;
917a718d 2702 struct lttng_pipe *client_quit_pipe;
cd9adb8b 2703 struct lttng_thread *thread = nullptr;
0f68efb6 2704 int client_sock_fd = -1;
917a718d 2705
6cb45e93 2706 sem_init(&thread_state.ready, 0, 0);
917a718d
JG
2707 client_quit_pipe = lttng_pipe_open(FD_CLOEXEC);
2708 if (!client_quit_pipe) {
2709 goto error;
2710 }
2711
0f68efb6
JG
2712 client_sock_fd = create_client_sock();
2713 if (client_sock_fd < 0) {
2714 goto error;
2715 }
2716
2717 thread_state.client_sock = client_sock_fd;
917a718d 2718 thread = lttng_thread_create("Client management",
28ab034a
JG
2719 thread_manage_clients,
2720 shutdown_client_thread,
2721 cleanup_client_thread,
2722 client_quit_pipe);
917a718d
JG
2723 if (!thread) {
2724 goto error;
2725 }
0f68efb6
JG
2726 /* The client thread now owns the client sock fd and the quit pipe. */
2727 client_sock_fd = -1;
cd9adb8b 2728 client_quit_pipe = nullptr;
917a718d
JG
2729
2730 /*
2731 * This thread is part of the threads that need to be fully
2732 * initialized before the session daemon is marked as "ready".
2733 */
6cb45e93
JG
2734 thread_running = wait_thread_status();
2735 if (!thread_running) {
0f68efb6 2736 goto error;
6cb45e93 2737 }
917a718d
JG
2738 return thread;
2739error:
0f68efb6
JG
2740 if (client_sock_fd >= 0) {
2741 if (close(client_sock_fd)) {
2742 PERROR("Failed to close client socket");
2743 }
2744 }
2745 lttng_thread_put(thread);
917a718d 2746 cleanup_client_thread(client_quit_pipe);
cd9adb8b 2747 return nullptr;
917a718d 2748}
This page took 0.205593 seconds and 4 git commands to generate.