clang-tidy: add Chrome-inspired checks
[lttng-tools.git] / src / lib / lttng-ctl / save.cpp
1 /*
2 * Copyright (C) 2013 Jérémie Galarneau <jeremie.galarneau@efficios.com>
3 *
4 * SPDX-License-Identifier: LGPL-2.1-only
5 *
6 */
7
8 #define _LGPL_SOURCE
9 #include "lttng-ctl-helper.hpp"
10
11 #include <common/sessiond-comm/sessiond-comm.hpp>
12
13 #include <lttng/lttng-error.h>
14 #include <lttng/save-internal.hpp>
15 #include <lttng/save.h>
16
17 #include <string.h>
18
19 struct lttng_save_session_attr *lttng_save_session_attr_create(void)
20 {
21 return zmalloc<lttng_save_session_attr>();
22 }
23
24 void lttng_save_session_attr_destroy(struct lttng_save_session_attr *output)
25 {
26 if (output) {
27 free(output);
28 }
29 }
30
31 const char *lttng_save_session_attr_get_session_name(struct lttng_save_session_attr *attr)
32 {
33 const char *ret = nullptr;
34
35 if (attr && attr->session_name[0]) {
36 ret = attr->session_name;
37 }
38
39 return ret;
40 }
41
42 const char *lttng_save_session_attr_get_output_url(struct lttng_save_session_attr *attr)
43 {
44 const char *ret = nullptr;
45
46 if (attr && attr->configuration_url[0]) {
47 ret = attr->configuration_url;
48 }
49
50 return ret;
51 }
52
53 int lttng_save_session_attr_get_overwrite(struct lttng_save_session_attr *attr)
54 {
55 return attr ? attr->overwrite : -LTTNG_ERR_INVALID;
56 }
57
58 int lttng_save_session_attr_get_omit_name(struct lttng_save_session_attr *attr)
59 {
60 return attr ? attr->omit_name : -LTTNG_ERR_INVALID;
61 }
62
63 int lttng_save_session_attr_get_omit_output(struct lttng_save_session_attr *attr)
64 {
65 return attr ? attr->omit_output : -LTTNG_ERR_INVALID;
66 }
67
68 int lttng_save_session_attr_set_session_name(struct lttng_save_session_attr *attr,
69 const char *session_name)
70 {
71 int ret = 0;
72
73 if (!attr) {
74 ret = -LTTNG_ERR_INVALID;
75 goto error;
76 }
77
78 if (session_name) {
79 size_t len;
80
81 len = strlen(session_name);
82 if (len >= LTTNG_NAME_MAX) {
83 ret = -LTTNG_ERR_INVALID;
84 goto error;
85 }
86
87 ret = lttng_strncpy(attr->session_name, session_name, sizeof(attr->session_name));
88 if (ret) {
89 ret = -LTTNG_ERR_INVALID;
90 goto error;
91 }
92 } else {
93 attr->session_name[0] = '\0';
94 }
95 error:
96 return ret;
97 }
98
99 int lttng_save_session_attr_set_output_url(struct lttng_save_session_attr *attr, const char *url)
100 {
101 int ret = 0;
102 size_t len;
103 ssize_t size;
104 struct lttng_uri *uris = nullptr;
105
106 if (!attr) {
107 ret = -LTTNG_ERR_INVALID;
108 goto error;
109 }
110
111 if (!url) {
112 attr->configuration_url[0] = '\0';
113 ret = 0;
114 goto end;
115 }
116
117 len = strlen(url);
118 if (len >= PATH_MAX) {
119 ret = -LTTNG_ERR_INVALID;
120 goto error;
121 }
122
123 size = uri_parse_str_urls(url, nullptr, &uris);
124 if (size <= 0 || uris[0].dtype != LTTNG_DST_PATH) {
125 ret = -LTTNG_ERR_INVALID;
126 goto error;
127 }
128
129 /* Copy string plus the NULL terminated byte. */
130 ret = lttng_strncpy(
131 attr->configuration_url, uris[0].dst.path, sizeof(attr->configuration_url));
132 if (ret) {
133 ret = -LTTNG_ERR_INVALID;
134 goto error;
135 }
136
137 end:
138 error:
139 free(uris);
140 return ret;
141 }
142
143 int lttng_save_session_attr_set_overwrite(struct lttng_save_session_attr *attr, int overwrite)
144 {
145 int ret = 0;
146
147 if (!attr) {
148 ret = -LTTNG_ERR_INVALID;
149 goto end;
150 }
151
152 attr->overwrite = !!overwrite;
153 end:
154 return ret;
155 }
156
157 int lttng_save_session_attr_set_omit_name(struct lttng_save_session_attr *attr, int omit_name)
158 {
159 int ret = 0;
160
161 if (!attr) {
162 ret = -LTTNG_ERR_INVALID;
163 goto end;
164 }
165
166 attr->omit_name = !!omit_name;
167 end:
168 return ret;
169 }
170
171 int lttng_save_session_attr_set_omit_output(struct lttng_save_session_attr *attr, int omit_output)
172 {
173 int ret = 0;
174
175 if (!attr) {
176 ret = -LTTNG_ERR_INVALID;
177 goto end;
178 }
179
180 attr->omit_output = !!omit_output;
181 end:
182 return ret;
183 }
184
185 /*
186 * The lttng-ctl API does not expose all the information needed to save the
187 * session configurations. Thus, we must send a save command to the session
188 * daemon which will, in turn, save its current session configuration.
189 */
190 int lttng_save_session(struct lttng_save_session_attr *attr)
191 {
192 struct lttcomm_session_msg lsm;
193 int ret;
194
195 if (!attr) {
196 ret = -LTTNG_ERR_INVALID;
197 goto end;
198 }
199
200 memset(&lsm, 0, sizeof(lsm));
201 lsm.cmd_type = LTTCOMM_SESSIOND_COMMAND_SAVE_SESSION;
202
203 memcpy(&lsm.u.save_session.attr, attr, sizeof(struct lttng_save_session_attr));
204 ret = lttng_ctl_ask_sessiond(&lsm, nullptr);
205 end:
206 return ret;
207 }
This page took 0.033868 seconds and 5 git commands to generate.