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 free(attr
->override_attr
.path_url
);
47 free(attr
->override_attr
.ctrl_url
);
48 free(attr
->override_attr
.data_url
);
51 void lttng_load_session_attr_destroy(struct lttng_load_session_attr
*attr
)
54 reset_load_session_attr_urls(attr
);
59 const char *lttng_load_session_attr_get_session_name(
60 struct lttng_load_session_attr
*attr
)
62 const char *ret
= NULL
;
64 if (attr
&& attr
->session_name
[0]) {
65 ret
= attr
->session_name
;
71 const char *lttng_load_session_attr_get_input_url(
72 struct lttng_load_session_attr
*attr
)
74 const char *ret
= NULL
;
76 if (attr
&& attr
->input_url
[0]) {
77 ret
= attr
->input_url
;
83 int lttng_load_session_attr_get_overwrite(
84 struct lttng_load_session_attr
*attr
)
86 return attr
? attr
->overwrite
: -LTTNG_ERR_INVALID
;
89 const char *lttng_load_session_attr_get_override_path_url(
90 struct lttng_load_session_attr
*attr
)
92 const char *ret
= NULL
;
94 if (attr
&& attr
->override_attr
.path_url
) {
95 ret
= attr
->raw_override_path_url
;
101 const char *lttng_load_session_attr_get_override_ctrl_url(
102 struct lttng_load_session_attr
*attr
)
104 const char *ret
= NULL
;
106 if (attr
&& attr
->override_attr
.ctrl_url
) {
107 ret
= attr
->raw_override_ctrl_url
;
113 const char *lttng_load_session_attr_get_override_data_url(
114 struct lttng_load_session_attr
*attr
)
116 const char *ret
= NULL
;
118 if (attr
&& attr
->override_attr
.data_url
) {
119 ret
= attr
->raw_override_data_url
;
125 const char *lttng_load_session_attr_get_override_url(
126 struct lttng_load_session_attr
*attr
)
128 const char *ret
= NULL
;
130 if (attr
&& (attr
->override_attr
.path_url
||
131 (attr
->override_attr
.ctrl_url
&&
132 attr
->override_attr
.data_url
))) {
133 ret
= attr
->raw_override_url
;
139 int lttng_load_session_attr_set_session_name(
140 struct lttng_load_session_attr
*attr
, const char *session_name
)
145 ret
= -LTTNG_ERR_INVALID
;
152 len
= strlen(session_name
);
153 if (len
>= LTTNG_NAME_MAX
) {
154 ret
= -LTTNG_ERR_INVALID
;
158 strncpy(attr
->session_name
, session_name
, len
);
160 attr
->session_name
[0] = '\0';
166 int lttng_load_session_attr_set_input_url(
167 struct lttng_load_session_attr
*attr
, const char *url
)
172 struct lttng_uri
*uris
= NULL
;
175 ret
= -LTTNG_ERR_INVALID
;
180 attr
->input_url
[0] = '\0';
186 if (len
>= PATH_MAX
) {
187 ret
= -LTTNG_ERR_INVALID
;
191 size
= uri_parse_str_urls(url
, NULL
, &uris
);
192 if (size
<= 0 || uris
[0].dtype
!= LTTNG_DST_PATH
) {
193 ret
= -LTTNG_ERR_INVALID
;
197 /* Copy string plus the NULL terminated byte. */
198 lttng_ctl_copy_string(attr
->input_url
, uris
[0].dst
.path
,
199 sizeof(attr
->input_url
));
207 int lttng_load_session_attr_set_overwrite(
208 struct lttng_load_session_attr
*attr
, int overwrite
)
213 ret
= -LTTNG_ERR_INVALID
;
217 attr
->overwrite
= !!overwrite
;
222 int lttng_load_session_attr_set_override_ctrl_url(
223 struct lttng_load_session_attr
*attr
, const char *url
)
227 struct lttng_uri
*uri
= NULL
;
228 char *url_str
= NULL
;
229 char *raw_str
= NULL
;
232 ret
= -LTTNG_ERR_INVALID
;
236 if (attr
->override_attr
.path_url
) {
238 * FIXME: return a more meaningful error.
239 * Setting a ctrl override after a path override make no
242 ret
= -LTTNG_ERR_INVALID
;
247 * FIXME: uri_parse should be able to take as parameter the protocol
248 * type to validate "url". For now only check the parsing goes through;
249 * it will fail later on.
251 ret_size
= uri_parse(url
, &uri
);
253 ret
= -LTTNG_ERR_INVALID
;
257 if (uri
[0].port
== 0) {
258 uri
[0].port
= DEFAULT_NETWORK_CONTROL_PORT
;
261 url_str
= zmalloc(PATH_MAX
);
263 /* FIXME: return valid error */
264 ret
= -LTTNG_ERR_NOMEM
;
268 ret
= uri_to_str_url(&uri
[0], url_str
, PATH_MAX
);
270 ret
= -LTTNG_ERR_INVALID
;
275 raw_str
= lttng_strndup(url
, PATH_MAX
);
277 ret
= -LTTNG_ERR_NOMEM
;
281 /* Squash old value if any */
282 free(attr
->override_attr
.ctrl_url
);
283 free(attr
->raw_override_ctrl_url
);
285 /* Populate the object */
286 attr
->override_attr
.ctrl_url
= url_str
;
287 attr
->raw_override_ctrl_url
= raw_str
;
289 /* Ownership passed to attr. */
300 int lttng_load_session_attr_set_override_data_url(
301 struct lttng_load_session_attr
*attr
, const char *url
)
305 struct lttng_uri
*uri
= NULL
;
306 char *url_str
= NULL
;
307 char *raw_str
= NULL
;
310 ret
= -LTTNG_ERR_INVALID
;
314 if (attr
->override_attr
.path_url
) {
315 ret
= -LTTNG_ERR_INVALID
;
320 * FIXME: uri_parse should be able to take as parameter the protocol
321 * type to validate "url". For now only check the parsing goes through;
322 * it will fail later on.
324 ret_size
= uri_parse(url
, &uri
);
326 ret
= -LTTNG_ERR_INVALID
;
330 if (uri
[0].port
== 0) {
331 uri
[0].port
= DEFAULT_NETWORK_DATA_PORT
;
334 url_str
= zmalloc(PATH_MAX
);
336 ret
= -LTTNG_ERR_NOMEM
;
340 ret
= uri_to_str_url(&uri
[0], url_str
, PATH_MAX
);
342 ret
= -LTTNG_ERR_INVALID
;
347 raw_str
= lttng_strndup(url
, PATH_MAX
);
349 ret
= -LTTNG_ERR_NOMEM
;
353 /* Squash old value if any */
354 free(attr
->override_attr
.data_url
);
355 free(attr
->raw_override_data_url
);
357 /* Populate the object */
358 attr
->override_attr
.data_url
= url_str
;
359 attr
->raw_override_data_url
= raw_str
;
361 /* Ownership passed to attr. */
371 int lttng_load_session_attr_set_override_url(
372 struct lttng_load_session_attr
*attr
, const char *url
)
376 struct lttng_uri
*uri
= NULL
;
377 char *raw_url_str
= NULL
;
378 char *raw_path_str
= NULL
;
379 char *path_str
= NULL
;
380 char *raw_ctrl_str
= NULL
;
381 char *ctrl_str
= NULL
;
382 char *raw_data_str
= NULL
;
383 char *data_str
= NULL
;
384 char buffer
[PATH_MAX
];
386 if (!attr
|| !url
|| strlen(url
) >= PATH_MAX
) {
387 ret
= -LTTNG_ERR_INVALID
;
392 * FIXME: uri_parse should be able to take as parameter the protocol
393 * type to validate "url". For now only check the parsing goes through;
394 * it will fail later on.
396 ret_size
= uri_parse_str_urls(url
, NULL
, &uri
);
397 if (ret_size
< 0 || ret_size
> 2) {
398 /* Unexpected URL format. */
399 ret
= -LTTNG_ERR_INVALID
;
403 raw_url_str
= lttng_strndup(url
, PATH_MAX
);
405 ret
= -LTTNG_ERR_NOMEM
;
409 /* Get path | ctrl && data string URL. */
410 ret
= uri_to_str_url(&uri
[0], buffer
, sizeof(buffer
));
411 if (ret
< 0 || ret
>= PATH_MAX
) {
412 ret
= -LTTNG_ERR_INVALID
;
417 switch (uri
[0].dtype
) {
419 raw_path_str
= lttng_strndup(buffer
, PATH_MAX
);
421 ret
= -LTTNG_ERR_NOMEM
;
425 path_str
= lttng_strndup(raw_path_str
, PATH_MAX
);
427 ret
= -LTTNG_ERR_NOMEM
;
434 ret
= -LTTNG_ERR_INVALID
;
438 raw_ctrl_str
= lttng_strndup(buffer
, PATH_MAX
);
440 ret
= -LTTNG_ERR_NOMEM
;
444 ctrl_str
= lttng_strndup(raw_ctrl_str
, PATH_MAX
);
446 ret
= -LTTNG_ERR_NOMEM
;
450 /* Get the data uri. */
451 ret
= uri_to_str_url(&uri
[1], buffer
, sizeof(buffer
));
453 ret
= -LTTNG_ERR_INVALID
;
458 raw_data_str
= lttng_strndup(buffer
, PATH_MAX
);
460 ret
= -LTTNG_ERR_NOMEM
;
464 data_str
= lttng_strndup(raw_data_str
, PATH_MAX
);
466 ret
= -LTTNG_ERR_NOMEM
;
472 ret
= -LTTNG_ERR_INVALID
;
476 reset_load_session_attr_urls(attr
);
478 attr
->override_attr
.path_url
= path_str
;
479 attr
->override_attr
.ctrl_url
= ctrl_str
;
480 attr
->override_attr
.data_url
= data_str
;
482 attr
->raw_override_url
= raw_url_str
;
483 attr
->raw_override_path_url
= raw_path_str
;
484 attr
->raw_override_ctrl_url
= raw_ctrl_str
;
485 attr
->raw_override_data_url
= raw_data_str
;
487 /* Pass data ownership to attr. */
508 * The lttng-ctl API does not expose all the information needed to load the
509 * session configurations. Thus, we must send a load command to the session
510 * daemon which will, in turn, load its current session configuration.
512 int lttng_load_session(struct lttng_load_session_attr
*attr
)
515 const char *url
, *session_name
;
518 ret
= -LTTNG_ERR_INVALID
;
522 url
= attr
->input_url
[0] != '\0' ? attr
->input_url
: NULL
;
523 session_name
= attr
->session_name
[0] != '\0' ?
524 attr
->session_name
: NULL
;
526 ret
= config_load_session(url
, session_name
, attr
->overwrite
, 0);