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