2 * Copyright (C) 2019 EfficiOS, Inc.
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
19 #include <common/error.h>
20 #include <common/macros.h>
21 #include <lttng/action/action-internal.h>
22 #include <lttng/action/stop-session-internal.h>
23 #include <lttng/action/stop-session.h>
25 struct lttng_action_stop_session
{
26 struct lttng_action parent
;
32 struct lttng_action_stop_session_comm
{
33 /* Includes the trailing \0. */
34 uint32_t session_name_len
;
39 * - session name (null terminated)
44 static struct lttng_action_stop_session
*action_stop_session_from_action(
45 struct lttng_action
*action
)
49 return container_of(action
, struct lttng_action_stop_session
, parent
);
52 static const struct lttng_action_stop_session
*action_stop_session_from_action_const(
53 const struct lttng_action
*action
)
57 return container_of(action
, struct lttng_action_stop_session
, parent
);
60 static bool lttng_action_stop_session_validate(struct lttng_action
*action
)
63 struct lttng_action_stop_session
*action_stop_session
;
70 action_stop_session
= action_stop_session_from_action(action
);
72 /* A non-empty session name is mandatory. */
73 if (!action_stop_session
->session_name
||
74 strlen(action_stop_session
->session_name
) == 0) {
84 static bool lttng_action_stop_session_is_equal(const struct lttng_action
*_a
, const struct lttng_action
*_b
)
86 bool is_equal
= false;
87 const struct lttng_action_stop_session
*a
, *b
;
89 a
= action_stop_session_from_action_const(_a
);
90 b
= action_stop_session_from_action_const(_b
);
92 /* Action is not valid if this is not true. */
93 assert(a
->session_name
);
94 assert(b
->session_name
);
95 if (strcmp(a
->session_name
, b
->session_name
)) {
104 static int lttng_action_stop_session_serialize(
105 struct lttng_action
*action
, struct lttng_dynamic_buffer
*buf
)
107 struct lttng_action_stop_session
*action_stop_session
;
108 struct lttng_action_stop_session_comm comm
;
109 size_t session_name_len
;
115 action_stop_session
= action_stop_session_from_action(action
);
117 assert(action_stop_session
->session_name
);
119 DBG("Serializing stop session action: session-name: %s",
120 action_stop_session
->session_name
);
122 session_name_len
= strlen(action_stop_session
->session_name
) + 1;
123 comm
.session_name_len
= session_name_len
;
125 ret
= lttng_dynamic_buffer_append(buf
, &comm
, sizeof(comm
));
131 ret
= lttng_dynamic_buffer_append(buf
,
132 action_stop_session
->session_name
, session_name_len
);
143 static void lttng_action_stop_session_destroy(struct lttng_action
*action
)
145 struct lttng_action_stop_session
*action_stop_session
;
151 action_stop_session
= action_stop_session_from_action(action
);
153 free(action_stop_session
->session_name
);
154 free(action_stop_session
);
160 ssize_t
lttng_action_stop_session_create_from_buffer(
161 const struct lttng_buffer_view
*view
,
162 struct lttng_action
**p_action
)
164 ssize_t consumed_len
;
165 struct lttng_action_stop_session_comm
*comm
;
166 const char *session_name
;
167 struct lttng_action
*action
;
168 enum lttng_action_status status
;
170 action
= lttng_action_stop_session_create();
176 comm
= (struct lttng_action_stop_session_comm
*) view
->data
;
177 session_name
= (const char *) &comm
->data
;
179 if (!lttng_buffer_view_validate_string(
180 view
, session_name
, comm
->session_name_len
)) {
185 status
= lttng_action_stop_session_set_session_name(
186 action
, session_name
);
187 if (status
!= LTTNG_ACTION_STATUS_OK
) {
192 consumed_len
= sizeof(struct lttng_action_stop_session_comm
) +
193 comm
->session_name_len
;
198 lttng_action_stop_session_destroy(action
);
203 struct lttng_action
*lttng_action_stop_session_create(void)
205 struct lttng_action
*action
;
207 action
= zmalloc(sizeof(struct lttng_action_stop_session
));
212 lttng_action_init(action
, LTTNG_ACTION_TYPE_STOP_SESSION
,
213 lttng_action_stop_session_validate
,
214 lttng_action_stop_session_serialize
,
215 lttng_action_stop_session_is_equal
,
216 lttng_action_stop_session_destroy
);
222 enum lttng_action_status
lttng_action_stop_session_set_session_name(
223 struct lttng_action
*action
, const char *session_name
)
225 struct lttng_action_stop_session
*action_stop_session
;
226 enum lttng_action_status status
;
228 if (!action
|| !session_name
|| strlen(session_name
) == 0) {
229 status
= LTTNG_ACTION_STATUS_INVALID
;
233 action_stop_session
= action_stop_session_from_action(action
);
235 free(action_stop_session
->session_name
);
237 action_stop_session
->session_name
= strdup(session_name
);
238 if (!action_stop_session
->session_name
) {
239 status
= LTTNG_ACTION_STATUS_ERROR
;
243 status
= LTTNG_ACTION_STATUS_OK
;
248 enum lttng_action_status
lttng_action_stop_session_get_session_name(
249 const struct lttng_action
*action
, const char **session_name
)
251 const struct lttng_action_stop_session
*action_stop_session
;
252 enum lttng_action_status status
;
254 if (!action
|| !session_name
) {
255 status
= LTTNG_ACTION_STATUS_INVALID
;
259 action_stop_session
= action_stop_session_from_action_const(action
);
261 *session_name
= action_stop_session
->session_name
;
263 status
= LTTNG_ACTION_STATUS_OK
;