Clean-up: sessiond comm relay: change spaces to tabs
[lttng-tools.git] / src / lib / lttng-ctl / load.c
CommitLineData
9245bd0e 1/*
ab5be9fa 2 * Copyright (C) 2014 David Goulet <dgoulet@efficios.com>
9245bd0e 3 *
ab5be9fa 4 * SPDX-License-Identifier: LGPL-2.1-only
9245bd0e 5 *
9245bd0e
DG
6 */
7
6c1c0768 8#define _LGPL_SOURCE
9245bd0e
DG
9#include <assert.h>
10#include <string.h>
a2a75fa4 11#include <limits.h>
9245bd0e
DG
12
13#include <lttng/lttng-error.h>
14#include <lttng/load.h>
15#include <lttng/load-internal.h>
16#include <common/sessiond-comm/sessiond-comm.h>
f40ef1d5 17#include <common/config/session-config.h>
a2a75fa4
JR
18#include <common/uri.h>
19#include <common/macros.h>
20#include <common/compat/string.h>
9245bd0e
DG
21
22#include "lttng-ctl-helper.h"
23
24struct lttng_load_session_attr *lttng_load_session_attr_create(void)
25{
26 return zmalloc(sizeof(struct lttng_load_session_attr));
27}
28
a2a75fa4
JR
29static
30void reset_load_session_attr_urls(struct lttng_load_session_attr *attr)
31{
32 free(attr->raw_override_url);
33 free(attr->raw_override_path_url);
34 free(attr->raw_override_ctrl_url);
35 free(attr->raw_override_data_url);
1b08cbce
JR
36 if (attr->override_attr) {
37 free(attr->override_attr->path_url);
38 free(attr->override_attr->ctrl_url);
39 free(attr->override_attr->data_url);
2aaf5fc7 40 free(attr->override_attr->session_name);
1b08cbce 41 }
a2a75fa4
JR
42}
43
9245bd0e
DG
44void lttng_load_session_attr_destroy(struct lttng_load_session_attr *attr)
45{
46 if (attr) {
a2a75fa4 47 reset_load_session_attr_urls(attr);
1b08cbce 48 free(attr->override_attr);
9245bd0e
DG
49 free(attr);
50 }
51}
52
2aaf5fc7
JR
53static int validate_attr(const struct lttng_load_session_attr *attr)
54{
55 int ret = 0;
56
57 if (!attr) {
58 ret = -LTTNG_ERR_INVALID;
59 goto end;
60 }
61
62 if (!attr->override_attr) {
63 goto end;
64 }
65
66 /*
67 * Refuse override name if the objective is to load multiple session
68 * since this operation is ambiguous while loading multiple session.
69 */
70 if (attr->override_attr->session_name
71 && attr->session_name[0] == '\0') {
72 ret = -LTTNG_ERR_INVALID;
73 goto end;
74 }
75end:
76 return ret;
77}
78
9245bd0e
DG
79const char *lttng_load_session_attr_get_session_name(
80 struct lttng_load_session_attr *attr)
81{
82 const char *ret = NULL;
83
84 if (attr && attr->session_name[0]) {
85 ret = attr->session_name;
86 }
87
88 return ret;
89}
90
91const char *lttng_load_session_attr_get_input_url(
92 struct lttng_load_session_attr *attr)
93{
94 const char *ret = NULL;
95
96 if (attr && attr->input_url[0]) {
97 ret = attr->input_url;
98 }
99
100 return ret;
101}
102
103int lttng_load_session_attr_get_overwrite(
104 struct lttng_load_session_attr *attr)
105{
106 return attr ? attr->overwrite : -LTTNG_ERR_INVALID;
107}
108
a2a75fa4
JR
109const char *lttng_load_session_attr_get_override_ctrl_url(
110 struct lttng_load_session_attr *attr)
111{
112 const char *ret = NULL;
113
49c360e8
JR
114 if (!attr || !attr->override_attr) {
115 goto end;
a2a75fa4
JR
116 }
117
49c360e8
JR
118 ret = attr->raw_override_ctrl_url;
119end:
a2a75fa4
JR
120 return ret;
121}
122
123const char *lttng_load_session_attr_get_override_data_url(
124 struct lttng_load_session_attr *attr)
125{
126 const char *ret = NULL;
127
49c360e8
JR
128 if (!attr || !attr->override_attr) {
129 goto end;
a2a75fa4
JR
130 }
131
49c360e8
JR
132 ret = attr->raw_override_data_url;
133end:
a2a75fa4
JR
134 return ret;
135}
136
137const char *lttng_load_session_attr_get_override_url(
138 struct lttng_load_session_attr *attr)
139{
140 const char *ret = NULL;
141
49c360e8
JR
142 if (!attr || !attr->override_attr) {
143 goto end;
144 }
145
146 if ((attr->override_attr->path_url ||
1b08cbce
JR
147 (attr->override_attr->ctrl_url &&
148 attr->override_attr->data_url))) {
a2a75fa4
JR
149 ret = attr->raw_override_url;
150 }
49c360e8 151end:
a2a75fa4
JR
152 return ret;
153}
154
2aaf5fc7
JR
155const char *lttng_load_session_attr_get_override_session_name(
156 struct lttng_load_session_attr *attr)
157{
158 const char *ret = NULL;
159
160 if (!attr || !attr->override_attr) {
161 goto end;
162 }
163
164 ret = attr->override_attr->session_name;
165end:
166 return ret;
167}
168
9245bd0e
DG
169int lttng_load_session_attr_set_session_name(
170 struct lttng_load_session_attr *attr, const char *session_name)
171{
172 int ret = 0;
173
174 if (!attr) {
175 ret = -LTTNG_ERR_INVALID;
176 goto error;
177 }
178
179 if (session_name) {
180 size_t len;
181
182 len = strlen(session_name);
36d2e35d 183 if (len >= LTTNG_NAME_MAX) {
9245bd0e
DG
184 ret = -LTTNG_ERR_INVALID;
185 goto error;
186 }
187
3716477e
JG
188 ret = lttng_strncpy(attr->session_name, session_name,
189 sizeof(attr->session_name));
190 if (ret) {
191 ret = -LTTNG_ERR_INVALID;
192 goto error;
193 }
9245bd0e
DG
194 } else {
195 attr->session_name[0] = '\0';
196 }
197error:
198 return ret;
199}
200
201int lttng_load_session_attr_set_input_url(
202 struct lttng_load_session_attr *attr, const char *url)
203{
204 int ret = 0;
584e475e
JR
205 size_t len;
206 ssize_t size;
9245bd0e
DG
207 struct lttng_uri *uris = NULL;
208
209 if (!attr) {
210 ret = -LTTNG_ERR_INVALID;
211 goto error;
212 }
213
214 if (!url) {
215 attr->input_url[0] = '\0';
216 ret = 0;
217 goto end;
218 }
219
220 len = strlen(url);
221 if (len >= PATH_MAX) {
222 ret = -LTTNG_ERR_INVALID;
223 goto error;
224 }
225
226 size = uri_parse_str_urls(url, NULL, &uris);
227 if (size <= 0 || uris[0].dtype != LTTNG_DST_PATH) {
228 ret = -LTTNG_ERR_INVALID;
229 goto error;
230 }
231
232 /* Copy string plus the NULL terminated byte. */
233 lttng_ctl_copy_string(attr->input_url, uris[0].dst.path,
234 sizeof(attr->input_url));
235
236end:
237error:
238 free(uris);
239 return ret;
240}
241
242int lttng_load_session_attr_set_overwrite(
243 struct lttng_load_session_attr *attr, int overwrite)
244{
245 int ret = 0;
246
247 if (!attr) {
248 ret = -LTTNG_ERR_INVALID;
249 goto end;
250 }
251
252 attr->overwrite = !!overwrite;
253end:
254 return ret;
255}
256
a2a75fa4
JR
257int lttng_load_session_attr_set_override_ctrl_url(
258 struct lttng_load_session_attr *attr, const char *url)
259{
260 int ret = 0;
261 ssize_t ret_size;
262 struct lttng_uri *uri = NULL;
263 char *url_str = NULL;
264 char *raw_str = NULL;
265
266 if (!attr) {
267 ret = -LTTNG_ERR_INVALID;
268 goto end;
269 }
270
1b08cbce
JR
271 if (!attr->override_attr) {
272 attr->override_attr = zmalloc(
273 sizeof(struct config_load_session_override_attr));
274 if (!attr->override_attr) {
275 ret = -LTTNG_ERR_NOMEM;
276 goto end;
277 }
278 }
279
280 if (attr->override_attr->path_url) {
a2a75fa4 281 /*
1b08cbce
JR
282 * Setting a ctrl override after a path override makes no sense.
283 */
a2a75fa4
JR
284 ret = -LTTNG_ERR_INVALID;
285 goto end;
286 }
287
288 /*
289 * FIXME: uri_parse should be able to take as parameter the protocol
290 * type to validate "url". For now only check the parsing goes through;
291 * it will fail later on.
292 */
293 ret_size = uri_parse(url, &uri);
294 if (ret_size < 0) {
295 ret = -LTTNG_ERR_INVALID;
296 goto end;
297 }
298
299 if (uri[0].port == 0) {
300 uri[0].port = DEFAULT_NETWORK_CONTROL_PORT;
301 }
302
303 url_str = zmalloc(PATH_MAX);
304 if (!url_str) {
305 /* FIXME: return valid error */
306 ret = -LTTNG_ERR_NOMEM;
307 goto end;
308 }
309
310 ret = uri_to_str_url(&uri[0], url_str, PATH_MAX);
311 if (ret < 0) {
312 ret = -LTTNG_ERR_INVALID;
313 goto end;
314 }
315 ret = 0;
316
317 raw_str = lttng_strndup(url, PATH_MAX);
318 if (!raw_str) {
319 ret = -LTTNG_ERR_NOMEM;
320 goto end;
321 }
322
323 /* Squash old value if any */
1b08cbce 324 free(attr->override_attr->ctrl_url);
a2a75fa4
JR
325 free(attr->raw_override_ctrl_url);
326
327 /* Populate the object */
1b08cbce 328 attr->override_attr->ctrl_url = url_str;
a2a75fa4
JR
329 attr->raw_override_ctrl_url = raw_str;
330
331 /* Ownership passed to attr. */
332 url_str = NULL;
333 raw_str = NULL;
334
335end:
336 free(raw_str);
337 free(url_str);
338 free(uri);
339 return ret;
340}
341
342int lttng_load_session_attr_set_override_data_url(
343 struct lttng_load_session_attr *attr, const char *url)
344{
345 int ret = 0;
346 ssize_t ret_size;
347 struct lttng_uri *uri = NULL;
348 char *url_str = NULL;
349 char *raw_str = NULL;
350
351 if (!attr) {
352 ret = -LTTNG_ERR_INVALID;
353 goto end;
354 }
355
1b08cbce
JR
356 if (!attr->override_attr) {
357 attr->override_attr = zmalloc(
358 sizeof(struct config_load_session_override_attr));
359 if (!attr->override_attr) {
360 ret = -LTTNG_ERR_NOMEM;
361 goto end;
362 }
363 }
364
365 if (attr->override_attr->path_url) {
366 /*
367 * Setting a data override after a path override makes no sense.
368 */
a2a75fa4
JR
369 ret = -LTTNG_ERR_INVALID;
370 goto end;
371 }
372
373 /*
374 * FIXME: uri_parse should be able to take as parameter the protocol
375 * type to validate "url". For now only check the parsing goes through;
376 * it will fail later on.
377 */
378 ret_size = uri_parse(url, &uri);
379 if (ret_size < 0) {
380 ret = -LTTNG_ERR_INVALID;
381 goto end;
382 }
383
384 if (uri[0].port == 0) {
385 uri[0].port = DEFAULT_NETWORK_DATA_PORT;
386 }
387
388 url_str = zmalloc(PATH_MAX);
389 if (!url_str) {
390 ret = -LTTNG_ERR_NOMEM;
391 goto end;
392 }
393
394 ret = uri_to_str_url(&uri[0], url_str, PATH_MAX);
395 if (ret < 0) {
396 ret = -LTTNG_ERR_INVALID;
397 goto end;
398 }
399 ret = 0;
400
401 raw_str = lttng_strndup(url, PATH_MAX);
402 if (!raw_str) {
403 ret = -LTTNG_ERR_NOMEM;
404 goto end;
405 }
406
407 /* Squash old value if any */
1b08cbce 408 free(attr->override_attr->data_url);
a2a75fa4
JR
409 free(attr->raw_override_data_url);
410
411 /* Populate the object */
1b08cbce 412 attr->override_attr->data_url = url_str;
a2a75fa4
JR
413 attr->raw_override_data_url = raw_str;
414
415 /* Ownership passed to attr. */
416 url_str = NULL;
417 raw_str = NULL;
418end:
419 free(raw_str);
420 free(url_str);
421 free(uri);
422 return ret;
423}
424
425int lttng_load_session_attr_set_override_url(
426 struct lttng_load_session_attr *attr, const char *url)
427{
428 int ret = 0;
429 ssize_t ret_size;
430 struct lttng_uri *uri = NULL;
431 char *raw_url_str = NULL;
432 char *raw_path_str = NULL;
433 char *path_str = NULL;
434 char *raw_ctrl_str = NULL;
435 char *ctrl_str = NULL;
436 char *raw_data_str = NULL;
437 char *data_str = NULL;
438 char buffer[PATH_MAX];
439
440 if (!attr || !url || strlen(url) >= PATH_MAX) {
441 ret = -LTTNG_ERR_INVALID;
442 goto end;
443 }
444
1b08cbce
JR
445 if (!attr->override_attr) {
446 attr->override_attr = zmalloc(
447 sizeof(struct config_load_session_override_attr));
448 if (!attr->override_attr) {
449 ret = -LTTNG_ERR_NOMEM;
450 goto end;
451 }
452 }
453
a2a75fa4
JR
454 /*
455 * FIXME: uri_parse should be able to take as parameter the protocol
456 * type to validate "url". For now only check the parsing goes through;
457 * it will fail later on.
458 */
459 ret_size = uri_parse_str_urls(url, NULL, &uri);
460 if (ret_size < 0 || ret_size > 2) {
461 /* Unexpected URL format. */
462 ret = -LTTNG_ERR_INVALID;
463 goto end;
464 }
465
466 raw_url_str = lttng_strndup(url, PATH_MAX);
467 if (!raw_url_str) {
468 ret = -LTTNG_ERR_NOMEM;
469 goto end;
470 }
471
472 /* Get path | ctrl && data string URL. */
473 ret = uri_to_str_url(&uri[0], buffer, sizeof(buffer));
474 if (ret < 0 || ret >= PATH_MAX) {
475 ret = -LTTNG_ERR_INVALID;
476 goto end;
477 }
478 ret = 0;
479
480 switch (uri[0].dtype) {
481 case LTTNG_DST_PATH:
482 raw_path_str = lttng_strndup(buffer, PATH_MAX);
483 if (!raw_path_str) {
484 ret = -LTTNG_ERR_NOMEM;
485 goto end;
486 }
487
488 path_str = lttng_strndup(raw_path_str, PATH_MAX);
489 if (!path_str) {
490 ret = -LTTNG_ERR_NOMEM;
491 goto end;
492 }
493 break;
494 case LTTNG_DST_IPV4:
495 case LTTNG_DST_IPV6:
496 if (ret_size != 2) {
497 ret = -LTTNG_ERR_INVALID;
498 goto end;
499 }
500
501 raw_ctrl_str = lttng_strndup(buffer, PATH_MAX);
502 if (!raw_ctrl_str) {
503 ret = -LTTNG_ERR_NOMEM;
504 goto end;
505 }
506
507 ctrl_str = lttng_strndup(raw_ctrl_str, PATH_MAX);
508 if (!ctrl_str) {
509 ret = -LTTNG_ERR_NOMEM;
510 goto end;
511 }
512
513 /* Get the data uri. */
514 ret = uri_to_str_url(&uri[1], buffer, sizeof(buffer));
515 if (ret < 0) {
516 ret = -LTTNG_ERR_INVALID;
517 goto end;
518 }
519 ret = 0;
520
521 raw_data_str = lttng_strndup(buffer, PATH_MAX);
522 if (!raw_data_str) {
523 ret = -LTTNG_ERR_NOMEM;
524 goto end;
525 }
526
527 data_str = lttng_strndup(raw_data_str, PATH_MAX);
528 if (!data_str) {
529 ret = -LTTNG_ERR_NOMEM;
530 goto end;
531 }
532
533 break;
534 default:
535 ret = -LTTNG_ERR_INVALID;
536 goto end;
537 }
538
539 reset_load_session_attr_urls(attr);
540
1b08cbce
JR
541 attr->override_attr->path_url = path_str;
542 attr->override_attr->ctrl_url = ctrl_str;
543 attr->override_attr->data_url = data_str;
a2a75fa4
JR
544
545 attr->raw_override_url = raw_url_str;
546 attr->raw_override_path_url = raw_path_str;
547 attr->raw_override_ctrl_url = raw_ctrl_str;
548 attr->raw_override_data_url = raw_data_str;
549
550 /* Pass data ownership to attr. */
551 raw_url_str = NULL;
552 raw_path_str = NULL;
553 path_str = NULL;
554 raw_ctrl_str = NULL;
555 ctrl_str = NULL;
556 raw_data_str = NULL;
557 data_str = NULL;
558
559end:
560 free(raw_path_str);
561 free(path_str);
562 free(raw_ctrl_str);
563 free(ctrl_str);
564 free(raw_data_str);
565 free(data_str);
566 free(raw_url_str);
567 free(uri);
568 return ret;
569}
0d4bab5e 570
2aaf5fc7
JR
571int lttng_load_session_attr_set_override_session_name(
572 struct lttng_load_session_attr *attr, const char *session_name)
573{
574 int ret = 0;
575 size_t len;
576
577 if (!attr ||!session_name) {
578 ret = -LTTNG_ERR_INVALID;
579 goto end;
580 }
581
582 if (!attr->override_attr) {
583 attr->override_attr = zmalloc(
584 sizeof(struct config_load_session_override_attr));
585 if (!attr->override_attr) {
586 ret = -LTTNG_ERR_NOMEM;
587 goto end;
588 }
589 }
590
591 len = strlen(session_name);
592 if (len >= LTTNG_NAME_MAX) {
593 ret = -LTTNG_ERR_INVALID;
594 goto end;
595 }
596
597 attr->override_attr->session_name = lttng_strndup(session_name,
598 len);
599 if (!attr->override_attr->session_name) {
600 ret = -LTTNG_ERR_NOMEM;
601 goto end;
602 }
603end:
604 return ret;
605}
606
9245bd0e
DG
607int lttng_load_session(struct lttng_load_session_attr *attr)
608{
609 int ret;
18e29540 610 const char *url, *session_name;
9245bd0e
DG
611
612 if (!attr) {
613 ret = -LTTNG_ERR_INVALID;
614 goto end;
615 }
616
2aaf5fc7
JR
617 ret = validate_attr(attr);
618 if (ret) {
619 goto end;
620 }
621
18e29540
JG
622 url = attr->input_url[0] != '\0' ? attr->input_url : NULL;
623 session_name = attr->session_name[0] != '\0' ?
624 attr->session_name : NULL;
625
1b08cbce
JR
626 ret = config_load_session(url, session_name, attr->overwrite, 0,
627 attr->override_attr);
9245bd0e
DG
628
629end:
630 return ret;
631}
This page took 0.077609 seconds and 5 git commands to generate.