3 * Copyright (C) 2019 EfficiOS, Inc.
5 * This library is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU Lesser General Public License, version 2.1 only,
7 * as published by the Free Software Foundation.
9 * This library is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
14 * You should have received a copy of the GNU Lesser General Public License
15 * along with this library; if not, write to the Free Software Foundation,
16 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 * Copyright (C) 2019 Simon Marchi <simon.marchi@efficios.com>
20 * SPDX-License-Identifier: LGPL-2.1-only
22 >>>>>>> 2e5f09656... actions: introduce stop session action
26 #include <common/error.h>
27 #include <common/macros.h>
28 #include <lttng/action/action-internal.h>
29 #include <lttng/action/stop-session-internal.h>
30 #include <lttng/action/stop-session.h>
32 struct lttng_action_stop_session
{
33 struct lttng_action parent
;
39 struct lttng_action_stop_session_comm
{
40 /* Includes the trailing \0. */
41 uint32_t session_name_len
;
46 * - session name (null terminated)
51 static struct lttng_action_stop_session
*action_stop_session_from_action(
52 struct lttng_action
*action
)
56 return container_of(action
, struct lttng_action_stop_session
, parent
);
59 static const struct lttng_action_stop_session
*action_stop_session_from_action_const(
60 const struct lttng_action
*action
)
64 return container_of(action
, struct lttng_action_stop_session
, parent
);
67 static bool lttng_action_stop_session_validate(struct lttng_action
*action
)
70 struct lttng_action_stop_session
*action_stop_session
;
77 action_stop_session
= action_stop_session_from_action(action
);
79 /* A non-empty session name is mandatory. */
80 if (!action_stop_session
->session_name
||
81 strlen(action_stop_session
->session_name
) == 0) {
91 static bool lttng_action_stop_session_is_equal(const struct lttng_action
*_a
, const struct lttng_action
*_b
)
93 bool is_equal
= false;
94 const struct lttng_action_stop_session
*a
, *b
;
96 a
= action_stop_session_from_action_const(_a
);
97 b
= action_stop_session_from_action_const(_b
);
99 /* Action is not valid if this is not true. */
100 assert(a
->session_name
);
101 assert(b
->session_name
);
102 if (strcmp(a
->session_name
, b
->session_name
)) {
111 static int lttng_action_stop_session_serialize(
112 struct lttng_action
*action
, struct lttng_dynamic_buffer
*buf
)
114 struct lttng_action_stop_session
*action_stop_session
;
115 struct lttng_action_stop_session_comm comm
;
116 size_t session_name_len
;
122 action_stop_session
= action_stop_session_from_action(action
);
124 assert(action_stop_session
->session_name
);
126 DBG("Serializing stop session action: session-name: %s",
127 action_stop_session
->session_name
);
129 session_name_len
= strlen(action_stop_session
->session_name
) + 1;
130 comm
.session_name_len
= session_name_len
;
132 ret
= lttng_dynamic_buffer_append(buf
, &comm
, sizeof(comm
));
138 ret
= lttng_dynamic_buffer_append(buf
,
139 action_stop_session
->session_name
, session_name_len
);
150 static void lttng_action_stop_session_destroy(struct lttng_action
*action
)
152 struct lttng_action_stop_session
*action_stop_session
;
158 action_stop_session
= action_stop_session_from_action(action
);
160 free(action_stop_session
->session_name
);
161 free(action_stop_session
);
167 ssize_t
lttng_action_stop_session_create_from_buffer(
168 const struct lttng_buffer_view
*view
,
169 struct lttng_action
**p_action
)
171 ssize_t consumed_len
;
172 struct lttng_action_stop_session_comm
*comm
;
173 const char *session_name
;
174 struct lttng_action
*action
;
175 enum lttng_action_status status
;
177 action
= lttng_action_stop_session_create();
183 comm
= (struct lttng_action_stop_session_comm
*) view
->data
;
184 session_name
= (const char *) &comm
->data
;
186 if (!lttng_buffer_view_contains_string(
187 view
, session_name
, comm
->session_name_len
)) {
192 status
= lttng_action_stop_session_set_session_name(
193 action
, session_name
);
194 if (status
!= LTTNG_ACTION_STATUS_OK
) {
199 consumed_len
= sizeof(struct lttng_action_stop_session_comm
) +
200 comm
->session_name_len
;
205 lttng_action_stop_session_destroy(action
);
210 struct lttng_action
*lttng_action_stop_session_create(void)
212 struct lttng_action
*action
;
214 action
= zmalloc(sizeof(struct lttng_action_stop_session
));
219 lttng_action_init(action
, LTTNG_ACTION_TYPE_STOP_SESSION
,
220 lttng_action_stop_session_validate
,
221 lttng_action_stop_session_serialize
,
222 lttng_action_stop_session_is_equal
,
223 lttng_action_stop_session_destroy
);
229 enum lttng_action_status
lttng_action_stop_session_set_session_name(
230 struct lttng_action
*action
, const char *session_name
)
232 struct lttng_action_stop_session
*action_stop_session
;
233 enum lttng_action_status status
;
235 if (!action
|| !session_name
|| strlen(session_name
) == 0) {
236 status
= LTTNG_ACTION_STATUS_INVALID
;
240 action_stop_session
= action_stop_session_from_action(action
);
242 free(action_stop_session
->session_name
);
244 action_stop_session
->session_name
= strdup(session_name
);
245 if (!action_stop_session
->session_name
) {
246 status
= LTTNG_ACTION_STATUS_ERROR
;
250 status
= LTTNG_ACTION_STATUS_OK
;
255 enum lttng_action_status
lttng_action_stop_session_get_session_name(
256 const struct lttng_action
*action
, const char **session_name
)
258 const struct lttng_action_stop_session
*action_stop_session
;
259 enum lttng_action_status status
;
261 if (!action
|| !session_name
) {
262 status
= LTTNG_ACTION_STATUS_INVALID
;
266 action_stop_session
= action_stop_session_from_action_const(action
);
268 *session_name
= action_stop_session
->session_name
;
270 status
= LTTNG_ACTION_STATUS_OK
;