2 * Copyright (C) 2019 Simon Marchi <simon.marchi@efficios.com>
4 * SPDX-License-Identifier: LGPL-2.1-only
9 #include <common/error.h>
10 #include <common/macros.h>
11 #include <lttng/action/action-internal.h>
12 #include <lttng/action/start-session-internal.h>
13 #include <lttng/action/start-session.h>
15 struct lttng_action_start_session
{
16 struct lttng_action parent
;
22 struct lttng_action_start_session_comm
{
23 /* Includes the trailing \0. */
24 uint32_t session_name_len
;
29 * - session name (null terminated)
34 static struct lttng_action_start_session
*action_start_session_from_action(
35 struct lttng_action
*action
)
39 return container_of(action
, struct lttng_action_start_session
, parent
);
42 static const struct lttng_action_start_session
*action_start_session_from_action_const(
43 const struct lttng_action
*action
)
47 return container_of(action
, struct lttng_action_start_session
, parent
);
50 static bool lttng_action_start_session_validate(struct lttng_action
*action
)
53 struct lttng_action_start_session
*action_start_session
;
60 action_start_session
= action_start_session_from_action(action
);
62 /* A non-empty session name is mandatory. */
63 if (!action_start_session
->session_name
||
64 strlen(action_start_session
->session_name
) == 0) {
74 static bool lttng_action_start_session_is_equal(const struct lttng_action
*_a
, const struct lttng_action
*_b
)
76 bool is_equal
= false;
77 struct lttng_action_start_session
*a
, *b
;
79 a
= container_of(_a
, struct lttng_action_start_session
, parent
);
80 b
= container_of(_b
, struct lttng_action_start_session
, parent
);
82 /* Action is not valid if this is not true. */
83 assert(a
->session_name
);
84 assert(b
->session_name
);
85 if (strcmp(a
->session_name
, b
->session_name
)) {
94 static int lttng_action_start_session_serialize(
95 struct lttng_action
*action
, struct lttng_dynamic_buffer
*buf
)
97 struct lttng_action_start_session
*action_start_session
;
98 struct lttng_action_start_session_comm comm
;
99 size_t session_name_len
;
105 action_start_session
= action_start_session_from_action(action
);
107 assert(action_start_session
->session_name
);
109 DBG("Serializing start session action: session-name: %s",
110 action_start_session
->session_name
);
112 session_name_len
= strlen(action_start_session
->session_name
) + 1;
113 comm
.session_name_len
= session_name_len
;
115 ret
= lttng_dynamic_buffer_append(buf
, &comm
, sizeof(comm
));
121 ret
= lttng_dynamic_buffer_append(buf
,
122 action_start_session
->session_name
, session_name_len
);
133 static void lttng_action_start_session_destroy(struct lttng_action
*action
)
135 struct lttng_action_start_session
*action_start_session
;
141 action_start_session
= action_start_session_from_action(action
);
143 free(action_start_session
->session_name
);
144 free(action_start_session
);
150 ssize_t
lttng_action_start_session_create_from_buffer(
151 const struct lttng_buffer_view
*view
,
152 struct lttng_action
**p_action
)
154 ssize_t consumed_len
;
155 struct lttng_action_start_session_comm
*comm
;
156 const char *session_name
;
157 struct lttng_action
*action
;
158 enum lttng_action_status status
;
160 action
= lttng_action_start_session_create();
166 comm
= (struct lttng_action_start_session_comm
*) view
->data
;
167 session_name
= (const char *) &comm
->data
;
169 if (!lttng_buffer_view_contains_string(
170 view
, session_name
, comm
->session_name_len
)) {
175 status
= lttng_action_start_session_set_session_name(
176 action
, session_name
);
177 if (status
!= LTTNG_ACTION_STATUS_OK
) {
182 consumed_len
= sizeof(struct lttng_action_start_session_comm
) +
183 comm
->session_name_len
;
188 lttng_action_start_session_destroy(action
);
193 struct lttng_action
*lttng_action_start_session_create(void)
195 struct lttng_action
*action
;
197 action
= zmalloc(sizeof(struct lttng_action_start_session
));
202 lttng_action_init(action
, LTTNG_ACTION_TYPE_START_SESSION
,
203 lttng_action_start_session_validate
,
204 lttng_action_start_session_serialize
,
205 lttng_action_start_session_is_equal
,
206 lttng_action_start_session_destroy
);
212 enum lttng_action_status
lttng_action_start_session_set_session_name(
213 struct lttng_action
*action
, const char *session_name
)
215 struct lttng_action_start_session
*action_start_session
;
216 enum lttng_action_status status
;
218 if (!action
|| !session_name
|| strlen(session_name
) == 0) {
219 status
= LTTNG_ACTION_STATUS_INVALID
;
223 action_start_session
= action_start_session_from_action(action
);
225 free(action_start_session
->session_name
);
227 action_start_session
->session_name
= strdup(session_name
);
228 if (!action_start_session
->session_name
) {
229 status
= LTTNG_ACTION_STATUS_ERROR
;
233 status
= LTTNG_ACTION_STATUS_OK
;
238 enum lttng_action_status
lttng_action_start_session_get_session_name(
239 const struct lttng_action
*action
, const char **session_name
)
241 const struct lttng_action_start_session
*action_start_session
;
242 enum lttng_action_status status
;
244 if (!action
|| !session_name
) {
245 status
= LTTNG_ACTION_STATUS_INVALID
;
249 action_start_session
= action_start_session_from_action_const(action
);
251 *session_name
= action_start_session
->session_name
;
253 status
= LTTNG_ACTION_STATUS_OK
;