2 * Copyright (C) 2014 - David Goulet <dgoulet@efficios.com>
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.
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
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
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>
27 #include <common/config/session-config.h>
28 #include <common/uri.h>
29 #include <common/macros.h>
30 #include <common/compat/string.h>
32 #include "lttng-ctl-helper.h"
34 struct lttng_load_session_attr
*lttng_load_session_attr_create(void)
36 return zmalloc(sizeof(struct lttng_load_session_attr
));
40 void reset_load_session_attr_urls(struct lttng_load_session_attr
*attr
)
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
);
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
);
53 void lttng_load_session_attr_destroy(struct lttng_load_session_attr
*attr
)
56 reset_load_session_attr_urls(attr
);
57 free(attr
->override_attr
);
62 const char *lttng_load_session_attr_get_session_name(
63 struct lttng_load_session_attr
*attr
)
65 const char *ret
= NULL
;
67 if (attr
&& attr
->session_name
[0]) {
68 ret
= attr
->session_name
;
74 const char *lttng_load_session_attr_get_input_url(
75 struct lttng_load_session_attr
*attr
)
77 const char *ret
= NULL
;
79 if (attr
&& attr
->input_url
[0]) {
80 ret
= attr
->input_url
;
86 int lttng_load_session_attr_get_overwrite(
87 struct lttng_load_session_attr
*attr
)
89 return attr
? attr
->overwrite
: -LTTNG_ERR_INVALID
;
92 const char *lttng_load_session_attr_get_override_path_url(
93 struct lttng_load_session_attr
*attr
)
95 const char *ret
= NULL
;
97 if (attr
&& attr
->override_attr
->path_url
) {
98 ret
= attr
->raw_override_path_url
;
104 const char *lttng_load_session_attr_get_override_ctrl_url(
105 struct lttng_load_session_attr
*attr
)
107 const char *ret
= NULL
;
109 if (attr
&& attr
->override_attr
->ctrl_url
) {
110 ret
= attr
->raw_override_ctrl_url
;
116 const char *lttng_load_session_attr_get_override_data_url(
117 struct lttng_load_session_attr
*attr
)
119 const char *ret
= NULL
;
121 if (attr
&& attr
->override_attr
->data_url
) {
122 ret
= attr
->raw_override_data_url
;
128 const char *lttng_load_session_attr_get_override_url(
129 struct lttng_load_session_attr
*attr
)
131 const char *ret
= NULL
;
133 if (attr
&& (attr
->override_attr
->path_url
||
134 (attr
->override_attr
->ctrl_url
&&
135 attr
->override_attr
->data_url
))) {
136 ret
= attr
->raw_override_url
;
142 int lttng_load_session_attr_set_session_name(
143 struct lttng_load_session_attr
*attr
, const char *session_name
)
148 ret
= -LTTNG_ERR_INVALID
;
155 len
= strlen(session_name
);
156 if (len
>= LTTNG_NAME_MAX
) {
157 ret
= -LTTNG_ERR_INVALID
;
161 strncpy(attr
->session_name
, session_name
, len
);
163 attr
->session_name
[0] = '\0';
169 int lttng_load_session_attr_set_input_url(
170 struct lttng_load_session_attr
*attr
, const char *url
)
175 struct lttng_uri
*uris
= NULL
;
178 ret
= -LTTNG_ERR_INVALID
;
183 attr
->input_url
[0] = '\0';
189 if (len
>= PATH_MAX
) {
190 ret
= -LTTNG_ERR_INVALID
;
194 size
= uri_parse_str_urls(url
, NULL
, &uris
);
195 if (size
<= 0 || uris
[0].dtype
!= LTTNG_DST_PATH
) {
196 ret
= -LTTNG_ERR_INVALID
;
200 /* Copy string plus the NULL terminated byte. */
201 lttng_ctl_copy_string(attr
->input_url
, uris
[0].dst
.path
,
202 sizeof(attr
->input_url
));
210 int lttng_load_session_attr_set_overwrite(
211 struct lttng_load_session_attr
*attr
, int overwrite
)
216 ret
= -LTTNG_ERR_INVALID
;
220 attr
->overwrite
= !!overwrite
;
225 int lttng_load_session_attr_set_override_ctrl_url(
226 struct lttng_load_session_attr
*attr
, const char *url
)
230 struct lttng_uri
*uri
= NULL
;
231 char *url_str
= NULL
;
232 char *raw_str
= NULL
;
235 ret
= -LTTNG_ERR_INVALID
;
239 if (!attr
->override_attr
) {
240 attr
->override_attr
= zmalloc(
241 sizeof(struct config_load_session_override_attr
));
242 if (!attr
->override_attr
) {
243 ret
= -LTTNG_ERR_NOMEM
;
248 if (attr
->override_attr
->path_url
) {
250 * Setting a ctrl override after a path override makes no sense.
252 ret
= -LTTNG_ERR_INVALID
;
257 * FIXME: uri_parse should be able to take as parameter the protocol
258 * type to validate "url". For now only check the parsing goes through;
259 * it will fail later on.
261 ret_size
= uri_parse(url
, &uri
);
263 ret
= -LTTNG_ERR_INVALID
;
267 if (uri
[0].port
== 0) {
268 uri
[0].port
= DEFAULT_NETWORK_CONTROL_PORT
;
271 url_str
= zmalloc(PATH_MAX
);
273 /* FIXME: return valid error */
274 ret
= -LTTNG_ERR_NOMEM
;
278 ret
= uri_to_str_url(&uri
[0], url_str
, PATH_MAX
);
280 ret
= -LTTNG_ERR_INVALID
;
285 raw_str
= lttng_strndup(url
, PATH_MAX
);
287 ret
= -LTTNG_ERR_NOMEM
;
291 /* Squash old value if any */
292 free(attr
->override_attr
->ctrl_url
);
293 free(attr
->raw_override_ctrl_url
);
295 /* Populate the object */
296 attr
->override_attr
->ctrl_url
= url_str
;
297 attr
->raw_override_ctrl_url
= raw_str
;
299 /* Ownership passed to attr. */
310 int lttng_load_session_attr_set_override_data_url(
311 struct lttng_load_session_attr
*attr
, const char *url
)
315 struct lttng_uri
*uri
= NULL
;
316 char *url_str
= NULL
;
317 char *raw_str
= NULL
;
320 ret
= -LTTNG_ERR_INVALID
;
324 if (!attr
->override_attr
) {
325 attr
->override_attr
= zmalloc(
326 sizeof(struct config_load_session_override_attr
));
327 if (!attr
->override_attr
) {
328 ret
= -LTTNG_ERR_NOMEM
;
333 if (attr
->override_attr
->path_url
) {
335 * Setting a data override after a path override makes no sense.
337 ret
= -LTTNG_ERR_INVALID
;
342 * FIXME: uri_parse should be able to take as parameter the protocol
343 * type to validate "url". For now only check the parsing goes through;
344 * it will fail later on.
346 ret_size
= uri_parse(url
, &uri
);
348 ret
= -LTTNG_ERR_INVALID
;
352 if (uri
[0].port
== 0) {
353 uri
[0].port
= DEFAULT_NETWORK_DATA_PORT
;
356 url_str
= zmalloc(PATH_MAX
);
358 ret
= -LTTNG_ERR_NOMEM
;
362 ret
= uri_to_str_url(&uri
[0], url_str
, PATH_MAX
);
364 ret
= -LTTNG_ERR_INVALID
;
369 raw_str
= lttng_strndup(url
, PATH_MAX
);
371 ret
= -LTTNG_ERR_NOMEM
;
375 /* Squash old value if any */
376 free(attr
->override_attr
->data_url
);
377 free(attr
->raw_override_data_url
);
379 /* Populate the object */
380 attr
->override_attr
->data_url
= url_str
;
381 attr
->raw_override_data_url
= raw_str
;
383 /* Ownership passed to attr. */
393 int lttng_load_session_attr_set_override_url(
394 struct lttng_load_session_attr
*attr
, const char *url
)
398 struct lttng_uri
*uri
= NULL
;
399 char *raw_url_str
= NULL
;
400 char *raw_path_str
= NULL
;
401 char *path_str
= NULL
;
402 char *raw_ctrl_str
= NULL
;
403 char *ctrl_str
= NULL
;
404 char *raw_data_str
= NULL
;
405 char *data_str
= NULL
;
406 char buffer
[PATH_MAX
];
408 if (!attr
|| !url
|| strlen(url
) >= PATH_MAX
) {
409 ret
= -LTTNG_ERR_INVALID
;
413 if (!attr
->override_attr
) {
414 attr
->override_attr
= zmalloc(
415 sizeof(struct config_load_session_override_attr
));
416 if (!attr
->override_attr
) {
417 ret
= -LTTNG_ERR_NOMEM
;
423 * FIXME: uri_parse should be able to take as parameter the protocol
424 * type to validate "url". For now only check the parsing goes through;
425 * it will fail later on.
427 ret_size
= uri_parse_str_urls(url
, NULL
, &uri
);
428 if (ret_size
< 0 || ret_size
> 2) {
429 /* Unexpected URL format. */
430 ret
= -LTTNG_ERR_INVALID
;
434 raw_url_str
= lttng_strndup(url
, PATH_MAX
);
436 ret
= -LTTNG_ERR_NOMEM
;
440 /* Get path | ctrl && data string URL. */
441 ret
= uri_to_str_url(&uri
[0], buffer
, sizeof(buffer
));
442 if (ret
< 0 || ret
>= PATH_MAX
) {
443 ret
= -LTTNG_ERR_INVALID
;
448 switch (uri
[0].dtype
) {
450 raw_path_str
= lttng_strndup(buffer
, PATH_MAX
);
452 ret
= -LTTNG_ERR_NOMEM
;
456 path_str
= lttng_strndup(raw_path_str
, PATH_MAX
);
458 ret
= -LTTNG_ERR_NOMEM
;
465 ret
= -LTTNG_ERR_INVALID
;
469 raw_ctrl_str
= lttng_strndup(buffer
, PATH_MAX
);
471 ret
= -LTTNG_ERR_NOMEM
;
475 ctrl_str
= lttng_strndup(raw_ctrl_str
, PATH_MAX
);
477 ret
= -LTTNG_ERR_NOMEM
;
481 /* Get the data uri. */
482 ret
= uri_to_str_url(&uri
[1], buffer
, sizeof(buffer
));
484 ret
= -LTTNG_ERR_INVALID
;
489 raw_data_str
= lttng_strndup(buffer
, PATH_MAX
);
491 ret
= -LTTNG_ERR_NOMEM
;
495 data_str
= lttng_strndup(raw_data_str
, PATH_MAX
);
497 ret
= -LTTNG_ERR_NOMEM
;
503 ret
= -LTTNG_ERR_INVALID
;
507 reset_load_session_attr_urls(attr
);
509 attr
->override_attr
->path_url
= path_str
;
510 attr
->override_attr
->ctrl_url
= ctrl_str
;
511 attr
->override_attr
->data_url
= data_str
;
513 attr
->raw_override_url
= raw_url_str
;
514 attr
->raw_override_path_url
= raw_path_str
;
515 attr
->raw_override_ctrl_url
= raw_ctrl_str
;
516 attr
->raw_override_data_url
= raw_data_str
;
518 /* Pass data ownership to attr. */
539 int lttng_load_session(struct lttng_load_session_attr
*attr
)
542 const char *url
, *session_name
;
545 ret
= -LTTNG_ERR_INVALID
;
549 url
= attr
->input_url
[0] != '\0' ? attr
->input_url
: NULL
;
550 session_name
= attr
->session_name
[0] != '\0' ?
551 attr
->session_name
: NULL
;
553 ret
= config_load_session(url
, session_name
, attr
->overwrite
, 0,
554 attr
->override_attr
);