Add time validation to health check
[lttng-tools.git] / src / bin / lttng-sessiond / kernel-consumer.c
CommitLineData
f1e16794
DG
1/*
2 * Copyright (C) 2012 - David Goulet <dgoulet@efficios.com>
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License, version 2 only, as
6 * published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
11 * more details.
12 *
13 * You should have received a copy of the GNU General Public License along with
14 * this program; if not, write to the Free Software Foundation, Inc., 51
15 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16 */
17
18#define _GNU_SOURCE
19#include <stdio.h>
20#include <stdlib.h>
21#include <string.h>
22#include <sys/stat.h>
23#include <unistd.h>
24
25#include <common/common.h>
26#include <common/defaults.h>
f1e16794 27
00e2e675 28#include "consumer.h"
f1e16794
DG
29#include "kernel-consumer.h"
30
00e2e675
DG
31/*
32 * Sending a single channel to the consumer with command ADD_CHANNEL.
33 */
34int kernel_consumer_add_channel(int sock, struct ltt_kernel_channel *channel)
35{
36 int ret;
37 struct lttcomm_consumer_msg lkm;
38
39 /* Safety net */
40 assert(channel);
41
42 DBG("Kernel consumer adding channel %s to kernel consumer",
43 channel->channel->name);
44
45 /* Prep channel message structure */
46 consumer_init_channel_comm_msg(&lkm,
47 LTTNG_CONSUMER_ADD_CHANNEL,
48 channel->fd,
49 channel->channel->attr.subbuf_size,
50 0, /* Kernel */
51 channel->channel->name);
52
53 ret = consumer_send_channel(sock, &lkm);
54 if (ret < 0) {
55 goto error;
56 }
57
58error:
59 return ret;
60}
61
62/*
63 * Sending metadata to the consumer with command ADD_CHANNEL and ADD_STREAM.
64 */
65int kernel_consumer_add_metadata(int sock, struct ltt_kernel_session *session)
66{
67 int ret;
68 const char *pathname;
69 struct lttcomm_consumer_msg lkm;
70 struct consumer_output *output;
71
72 /* Safety net */
73 assert(session);
74 assert(session->consumer);
75
76 DBG("Sending metadata %d to kernel consumer", session->metadata_stream_fd);
77
78 /* Get consumer output pointer */
79 output = session->consumer;
80
81 /* Get correct path name destination */
82 if (output->type == CONSUMER_DST_LOCAL) {
83 pathname = output->dst.trace_path;
84 } else {
85 pathname = output->subdir;
86 }
87
88 /* Prep channel message structure */
89 consumer_init_channel_comm_msg(&lkm,
90 LTTNG_CONSUMER_ADD_CHANNEL,
91 session->metadata->fd,
92 session->metadata->conf->attr.subbuf_size,
93 0, /* for kernel */
94 "metadata");
95
96 ret = consumer_send_channel(sock, &lkm);
97 if (ret < 0) {
98 goto error;
99 }
100
101 /* Prep stream message structure */
102 consumer_init_stream_comm_msg(&lkm,
103 LTTNG_CONSUMER_ADD_STREAM,
104 session->metadata->fd,
105 session->metadata_stream_fd,
106 LTTNG_CONSUMER_ACTIVE_STREAM,
107 DEFAULT_KERNEL_CHANNEL_OUTPUT,
108 0, /* Kernel */
109 session->uid,
110 session->gid,
111 output->net_seq_index,
112 1, /* Metadata flag set */
113 "metadata",
114 pathname);
115
116 /* Send stream and file descriptor */
117 ret = consumer_send_stream(sock, output, &lkm,
118 &session->metadata_stream_fd, 1);
119 if (ret < 0) {
120 goto error;
121 }
122
123error:
124 return ret;
125}
126
127/*
128 * Sending a single stream to the consumer with command ADD_STREAM.
129 */
130int kernel_consumer_add_stream(int sock, struct ltt_kernel_channel *channel,
131 struct ltt_kernel_stream *stream, struct ltt_kernel_session *session)
132{
133 int ret;
134 const char *pathname;
135 struct lttcomm_consumer_msg lkm;
136 struct consumer_output *output;
137
138 assert(channel);
139 assert(stream);
140 assert(session);
141 assert(session->consumer);
142
143 DBG("Sending stream %d of channel %s to kernel consumer",
144 stream->fd, channel->channel->name);
145
146 /* Get consumer output pointer */
147 output = session->consumer;
148
149 /* Get correct path name destination */
150 if (output->type == CONSUMER_DST_LOCAL) {
151 pathname = output->dst.trace_path;
152 DBG3("Consumer is local to %s", pathname);
153 } else {
154 pathname = output->subdir;
155 DBG3("Consumer is network to subdir %s", pathname);
156 }
157
158 /* Prep stream consumer message */
159 consumer_init_stream_comm_msg(&lkm, LTTNG_CONSUMER_ADD_STREAM,
160 channel->fd,
161 stream->fd,
162 stream->state,
163 channel->channel->attr.output,
164 0, /* Kernel */
165 session->uid,
166 session->gid,
167 output->net_seq_index,
168 0, /* Metadata flag unset */
169 stream->name,
170 pathname);
171
172 /* Send stream and file descriptor */
173 ret = consumer_send_stream(sock, output, &lkm, &stream->fd, 1);
174 if (ret < 0) {
175 goto error;
176 }
177
178error:
179 return ret;
180}
181
f1e16794
DG
182/*
183 * Send all stream fds of kernel channel to the consumer.
184 */
00e2e675
DG
185int kernel_consumer_send_channel_stream(int sock,
186 struct ltt_kernel_channel *channel, struct ltt_kernel_session *session)
f1e16794 187{
00e2e675 188 int ret;
f1e16794 189 struct ltt_kernel_stream *stream;
00e2e675
DG
190
191 /* Safety net */
192 assert(channel);
193 assert(session);
194 assert(session->consumer);
195
196 /* Bail out if consumer is disabled */
197 if (!session->consumer->enabled) {
198 ret = LTTCOMM_OK;
199 goto error;
200 }
f1e16794
DG
201
202 DBG("Sending streams of channel %s to kernel consumer",
203 channel->channel->name);
204
00e2e675 205 ret = kernel_consumer_add_channel(sock, channel);
f1e16794 206 if (ret < 0) {
f1e16794
DG
207 goto error;
208 }
209
210 /* Send streams */
211 cds_list_for_each_entry(stream, &channel->stream_list.head, list) {
212 if (!stream->fd) {
213 continue;
214 }
00e2e675
DG
215
216 /* Add stream on the kernel consumer side. */
217 ret = kernel_consumer_add_stream(sock, channel, stream, session);
f1e16794 218 if (ret < 0) {
f1e16794
DG
219 goto error;
220 }
221 }
222
f1e16794
DG
223error:
224 return ret;
225}
226
227/*
228 * Send all stream fds of the kernel session to the consumer.
229 */
00e2e675 230int kernel_consumer_send_session(int sock, struct ltt_kernel_session *session)
f1e16794
DG
231{
232 int ret;
233 struct ltt_kernel_channel *chan;
f1e16794 234
00e2e675
DG
235 /* Safety net */
236 assert(session);
237 assert(session->consumer);
f1e16794 238
00e2e675
DG
239 /* Bail out if consumer is disabled */
240 if (!session->consumer->enabled) {
241 ret = LTTCOMM_OK;
242 goto error;
f1e16794
DG
243 }
244
00e2e675
DG
245 DBG("Sending session stream to kernel consumer");
246
f1e16794 247 if (session->metadata_stream_fd >= 0) {
00e2e675 248 ret = kernel_consumer_add_metadata(sock, session);
f1e16794 249 if (ret < 0) {
f1e16794
DG
250 goto error;
251 }
252
00e2e675
DG
253 /* Flag that at least the metadata has been sent to the consumer. */
254 session->consumer_fds_sent = 1;
f1e16794
DG
255 }
256
00e2e675 257 /* Send channel and streams of it */
f1e16794 258 cds_list_for_each_entry(chan, &session->channel_list.head, list) {
00e2e675 259 ret = kernel_consumer_send_channel_stream(sock, chan, session);
f1e16794
DG
260 if (ret < 0) {
261 goto error;
262 }
263 }
264
00e2e675 265 DBG("Kernel consumer FDs of metadata and channel streams sent");
f1e16794
DG
266
267 return 0;
268
269error:
270 return ret;
271}
This page took 0.034992 seconds and 4 git commands to generate.