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