Move to kernel style SPDX license identifiers
[lttng-tools.git] / src / common / kernel-consumer / kernel-consumer.c
index aea1b4831d158da0052d0533d1dc9279096a1eca..5075e05929238ade072391bf5367ae7f40c0433f 100644 (file)
@@ -1,20 +1,10 @@
 /*
- * Copyright (C) 2011 Julien Desfossez <julien.desfossez@polymtl.ca>
- *                      Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- * Copyright (C) 2017 Jérémie Galarneau <jeremie.galarneau@efficios.com>
+ * Copyright (C) 2011 Julien Desfossez <julien.desfossez@polymtl.ca>
+ * Copyright (C) 2011 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+ * Copyright (C) 2017 Jérémie Galarneau <jeremie.galarneau@efficios.com>
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License, version 2 only,
- * as published by the Free Software Foundation.
+ * SPDX-License-Identifier: GPL-2.0-only
  *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
 #define _LGPL_SOURCE
@@ -1159,6 +1149,32 @@ end_destroy_channel:
 error_rotate_channel:
                goto end_nosignal;
        }
+       case LTTNG_CONSUMER_CLEAR_CHANNEL:
+       {
+               struct lttng_consumer_channel *channel;
+               uint64_t key = msg.u.clear_channel.key;
+
+               channel = consumer_find_channel(key);
+               if (!channel) {
+                       DBG("Channel %" PRIu64 " not found", key);
+                       ret_code = LTTCOMM_CONSUMERD_CHAN_NOT_FOUND;
+               } else {
+                       ret = lttng_consumer_clear_channel(channel);
+                       if (ret) {
+                               ERR("Clear channel failed");
+                               ret_code = ret;
+                       }
+
+                       health_code_update();
+               }
+               ret = consumer_send_status_msg(sock, ret_code);
+               if (ret < 0) {
+                       /* Somehow, the session daemon is not responding anymore. */
+                       goto end_nosignal;
+               }
+
+               break;
+       }
        case LTTNG_CONSUMER_INIT:
        {
                ret_code = lttng_consumer_init_command(ctx,
@@ -1185,8 +1201,7 @@ error_rotate_channel:
                                *msg.u.create_trace_chunk.override_name ?
                                        msg.u.create_trace_chunk.override_name :
                                        NULL;
-               LTTNG_OPTIONAL(struct lttng_directory_handle) chunk_directory_handle =
-                               LTTNG_OPTIONAL_INIT;
+               struct lttng_directory_handle *chunk_directory_handle = NULL;
 
                /*
                 * The session daemon will only provide a chunk directory file
@@ -1211,17 +1226,15 @@ error_rotate_channel:
 
                        DBG("Received trace chunk directory fd (%d)",
                                        chunk_dirfd);
-                       ret = lttng_directory_handle_init_from_dirfd(
-                                       &chunk_directory_handle.value,
+                       chunk_directory_handle = lttng_directory_handle_create_from_dirfd(
                                        chunk_dirfd);
-                       if (ret) {
+                       if (!chunk_directory_handle) {
                                ERR("Failed to initialize chunk directory handle from directory file descriptor");
                                if (close(chunk_dirfd)) {
                                        PERROR("Failed to close chunk directory file descriptor");
                                }
                                goto error_fatal;
                        }
-                       chunk_directory_handle.is_set = true;
                }
 
                ret_code = lttng_consumer_create_trace_chunk(
@@ -1234,14 +1247,8 @@ error_rotate_channel:
                                msg.u.create_trace_chunk.credentials.is_set ?
                                                &credentials :
                                                NULL,
-                               chunk_directory_handle.is_set ?
-                                               &chunk_directory_handle.value :
-                                               NULL);
-
-               if (chunk_directory_handle.is_set) {
-                       lttng_directory_handle_fini(
-                                       &chunk_directory_handle.value);
-               }
+                               chunk_directory_handle);
+               lttng_directory_handle_put(chunk_directory_handle);
                goto end_msg_sessiond;
        }
        case LTTNG_CONSUMER_CLOSE_TRACE_CHUNK:
@@ -1454,6 +1461,7 @@ int update_stream_stats(struct lttng_consumer_stream *stream)
                if (ret == -ENOTTY) {
                        /* Command not implemented by lttng-modules. */
                        seq = -1ULL;
+                       stream->sequence_number_unavailable = true;
                } else {
                        PERROR("kernctl_get_sequence_number");
                        goto end;
@@ -1553,7 +1561,7 @@ ssize_t lttng_kconsumer_read_subbuffer(struct lttng_consumer_stream *stream,
        int err, write_index = 1, rotation_ret;
        ssize_t ret = 0;
        int infd = stream->wait_fd;
-       struct ctf_packet_index index;
+       struct ctf_packet_index index = {};
 
        DBG("In read_subbuffer (infd : %d)", infd);
 
This page took 0.025224 seconds and 4 git commands to generate.